Использование Retrofit в Android
У меня есть приложение для Android, которое имеет 3 действия:
- Активность входа в систему
- Выполнение задач, в которых отображаются все задачи, относящиеся к пользователю (заполняется с использованием адаптера массива)
- Активность task_details, которая возникает при нажатии задачи в списке
Я должен использовать REST Apis. Исследование, которое я сделал до сих пор, направляет меня на использование Retrofit. Я проверил, как его использовать, и выяснил, что:
- Задайте базовый URL-адрес в основной деятельности (Mine - это активность входа)
- Мне нужно создать класс API и определить мои функции с помощью аннотаций.
- Используйте Адаптер отдыха класса в Управлении и определите Обратные вызовы.
Если бы мое приложение было одним активным приложением, я бы все хрустнул в моем MainActivity.java, но я не знаю, как и где поставить весь код из шагов 1,2,3 для использования в моих 3 действиях. Не могли бы вы помогите, рассказав, как использовать Retrofit в моем приложении. Большое спасибо.
В частности, мне нужны сетевые вызовы: 1. Войдите в систему пользователя 2. Получите все задачи пользователя. И для обоих я буду использовать данный REST api.
*********************************************
Calling Api USing Retrofit
*********************************************
**Dependancies** :-
implementation 'com.android.support:recyclerview-v7:27.1.1'
implementation 'com.squareup.picasso:picasso:2.5.2'
implementation 'com.android.support:cardview-v7:27.1.1'
enter code here
**Model**
use the Pozo class
**Api Call**
-> getLogin() // use the method
//API call for Login
private void getLogin()
{
getWindow().setFlags(WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE,
WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE);
AsyncHttpClient client = new AsyncHttpClient();
RequestParams requestParams = new RequestParams();
requestParams.put("email_id", edit_email.getText().toString());
requestParams.put("password", edit_password.getText().toString());
Log.e("", "LOGIN URL==>" + Urls.LOGIN + requestParams);
Log.d("device_token", "Device_ Token" + FirebaseInstanceId.getInstance().getToken());
client.post(Urls.LOGIN, requestParams, new JsonHttpResponseHandler() {
@Override
public void onStart() {
super.onStart();
ShowProgress();
}
@Override
public void onFinish() {
super.onFinish();
Hideprogress();
}
@Override
public void onSuccess(int statusCode, Header[] headers, JSONObject response) {
super.onSuccess(statusCode, headers, response);
Log.e("", "Login RESPONSE-" + response);
Login login = new Gson().fromJson(String.valueOf(response), Login.class);
edit_email.setText("");
edit_password.setText("");
if (login.getStatus().equals("true")) {
getWindow().clearFlags(WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE);
MDToast mdToast = MDToast.makeText(SignInActivity.this, String.valueOf("User Login Successfully!"),
MDToast.LENGTH_SHORT, MDToast.TYPE_SUCCESS);
mdToast.show();
Utils.WriteSharePrefrence(SignInActivity.this, Util_Main.Constant.EMAIL, login.getData().getEmailId());
Utils.WriteSharePrefrence(SignInActivity.this, Constant.USERID, login.getData().getId());
Utils.WriteSharePrefrence(SignInActivity.this, Constant.USERNAME, login.getData().getFirstName());
Utils.WriteSharePrefrence(SignInActivity.this, Constant.PROFILE, login.getData().getProfileImage());
hideKeyboard(SignInActivity.this);
Intent intent = new Intent(SignInActivity.this, DashboardActivity.class);
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK);
startActivity(intent);
finish();
} else {
getWindow().clearFlags(WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE);
MDToast mdToast = MDToast.makeText(SignInActivity.this, String.valueOf("Login Denied"),
MDToast.LENGTH_SHORT, MDToast.TYPE_ERROR);
mdToast.show();
}
}
@Override
public void onFailure(int statusCode, Header[] headers, String responseString, Throwable throwable) {
super.onFailure(statusCode, headers, responseString, throwable);
Log.e("", throwable.getMessage());
getWindow().clearFlags(WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE);
MDToast mdToast = MDToast.makeText(SignInActivity.this, "Something went wrong",
MDToast.LENGTH_SHORT, MDToast.TYPE_ERROR);
mdToast.show();
}
});
}
Ответы
Ответ 1
Использование Retrofit довольно просто и просто.
Прежде всего, вам нужно добавить модификацию в свой проект, например, с помощью Gradle build sytem.
compile 'com.squareup.retrofit:retrofit:1.7.1' |
иначе вы можете загрузить .jar и поместить его в свою папку libs.
Затем вам нужно определить интерфейсы, которые будут использоваться Retrofit для вызова API для ваших конечных точек REST. Например для пользователей:
public interface YourUsersApi {
//You can use rx.java for sophisticated composition of requests
@GET("/users/{user}")
public Observable<SomeUserModel> fetchUser(@Path("user") String user);
//or you can just get your model if you use json api
@GET("/users/{user}")
public SomeUserModel fetchUser(@Path("user") String user);
//or if there are some special cases you can process your response manually
@GET("/users/{user}")
public Response fetchUser(@Path("user") String user);
}
Ok. Теперь вы определили свой интерфейс API, и можете попробовать его использовать.
Для начала вам нужно создать экземпляр RestAdapter и установить базовый URL-адрес вашего API-интерфейса. Это также довольно просто:
RestAdapter restAdapter = new RestAdapter.Builder()
.setEndpoint("https://yourserveraddress.com")
.build();
YourUsersApi yourUsersApi = restAdapter.create(YourUsersApi.class);
Здесь Retrofit будет считывать вашу информацию с интерфейса и под капотом создаст RestHandler в соответствии с предоставленной вами метаинфорой, которая фактически будет выполнять HTTP-запросы.
Затем под капотом, как только будет получен ответ, в случае json api ваши данные будут преобразованы в вашу модель с использованием библиотеки Gson, поэтому вы должны знать об этом факте, что ограничения, которые присутствуют в Gson, действительно присутствуют в Retrofit.
Чтобы продлить/переопределить процесс сериализаторов/десериализацию ваших данных ответа на ваши модели, вы можете захотеть предоставить свои настраиваемые сериализаторы/десеризаторы для модернизации.
Здесь вам нужно реализовать интерфейс конвертера и реализовать 2 метода fromBody() и toBody().
Вот пример:
public class SomeCustomRetrofitConverter implements Converter {
private GsonBuilder gb;
public SomeCustomRetrofitConverter() {
gb = new GsonBuilder();
//register your cursom custom type serialisers/deserialisers if needed
gb.registerTypeAdapter(SomeCutsomType.class, new SomeCutsomTypeDeserializer());
}
public static final String ENCODING = "UTF-8";
@Override
public Object fromBody(TypedInput body, Type type) throws ConversionException {
String charset = "UTF-8";
if (body.mimeType() != null) {
charset = MimeUtil.parseCharset(body.mimeType());
}
InputStreamReader isr = null;
try {
isr = new InputStreamReader(body.in(), charset);
Gson gson = gb.create();
return gson.fromJson(isr, type);
} catch (IOException e) {
throw new ConversionException(e);
} catch (JsonParseException e) {
throw new ConversionException(e);
} finally {
if (isr != null) {
try {
isr.close();
} catch (IOException ignored) {
}
}
}
}
@Override
public TypedOutput toBody(Object object) {
try {
Gson gson = gb.create();
return new JsonTypedOutput(gson.toJson(object).getBytes(ENCODING), ENCODING);
} catch (UnsupportedEncodingException e) {
throw new AssertionError(e);
}
}
private static class JsonTypedOutput implements TypedOutput {
private final byte[] jsonBytes;
private final String mimeType;
JsonTypedOutput(byte[] jsonBytes, String encode) {
this.jsonBytes = jsonBytes;
this.mimeType = "application/json; charset=" + encode;
}
@Override
public String fileName() {
return null;
}
@Override
public String mimeType() {
return mimeType;
}
@Override
public long length() {
return jsonBytes.length;
}
@Override
public void writeTo(OutputStream out) throws IOException {
out.write(jsonBytes);
}
}
}
И теперь вам нужно включить свои пользовательские адаптеры, если это необходимо, используя setConverter() при создании RestAdapter
Ok. Теперь вы знаете, как вы можете получать свои данные с сервера на свое приложение для Android. Но вам нужно как-то сжать ваши данные и вызвать звонок REST в нужном месте.
Там я бы предложил использовать службу android Service или AsyncTask или загрузчик или rx.java, которые будут запрашивать ваши данные в фоновом потоке, чтобы не блокировать ваш пользовательский интерфейс.
Итак, теперь вы можете найти наиболее подходящее место для вызова
SomeUserModel yourUser = yourUsersApi.fetchUser("someUsers")
для получения удаленных данных.
Ответ 2
Я только что использовал модификацию в течение пары недель, и сначала мне было трудно использовать ее в своем приложении. Я хотел бы поделиться с вами самым простым способом использования модификации в вашем приложении. И затем, если вы уже хорошо разбираетесь в модернизации, вы можете улучшить свои коды (отделяя ui от api и использовать обратные вызовы) и, возможно, получить некоторые методы из поста выше.
В вашем приложении у вас есть Вход, активность для списка задач и активность для просмотра подробной задачи.
Прежде всего, вам нужно добавить модификацию в свое приложение и два варианта, следуйте за сообщением @artemis выше.
Retrofit использует интерфейс как ваш API. Итак, создайте класс интерфейса.
public interface MyApi{
/*LOGIN*/
@GET("/api_reciever/login") //your login function in your api
public void login(@Query("username") String username,@Query("password") String password,Callback<String> calback); //this is for your login, and you can used String as response or you can use a POJO, retrofit is very rubust to convert JSON to POJO
/*GET LIST*/
@GET("/api_reciever/getlist") //a function in your api to get all the list
public void getTaskList(@Query("user_uuid") String user_uuid,Callback<ArrayList<Task>> callback); //this is an example of response POJO - make sure your variable name is the same with your json tagging
/*GET LIST*/
@GET("/api_reciever/getlistdetails") //a function in your api to get all the list
public void getTaskDetail(@Query("task_uuid") String task_uuid,Callback<Task> callback); //this is an example of response POJO - make sure your variable name is the same with your json tagging
}
Создайте еще один класс интерфейса, чтобы удержать все ваши BASE ADDRESS вашего api
public interface Constants{
public String URL = "www.yoururl.com"
}
В вашей активности входа создайте метод обработки модификации
private void myLogin(String username,String password){
RestAdapter restAdapter = new RestAdapter.Builder()
.setEndpoint(Constants.URL) //call your base url
.build();
MyApi mylogin = restAdapter.create(MyApi.class); //this is how retrofit create your api
mylogin.login(username,password,new Callback<String>() {
@Override
public void success(String s, Response response) {
//process your response if login successfull you can call Intent and launch your main activity
}
@Override
public void failure(RetrofitError retrofitError) {
retrofitError.printStackTrace(); //to see if you have errors
}
});
}
В вашем MainActivityList
private void myList(String user_uuid){
RestAdapter restAdapter = new RestAdapter.Builder()
.setEndpoint(Constants.URL) //call your base url
.build();
MyApi mytask = restAdapter.create(MyApi.class); //this is how retrofit create your api
mytask.getTaskDetail(user_uuid,new Callback<Task>>() {
@Override
public void success(ArrayList<Task> list, Response response) {
//process your response if successful load the list in your listview adapter
}
@Override
public void failure(RetrofitError retrofitError) {
retrofitError.printStackTrace(); //to see if you have errors
}
});
}
В вашем подробном списке
private void myDetailed(String task_uuid){
RestAdapter restAdapter = new RestAdapter.Builder()
.setEndpoint(Constants.URL) //call your base url
.build();
MyApi mytask = restAdapter.create(MyApi.class); //this is how retrofit create your api
mytask.getTaskList(task_uuid,new Callback<Task>() {
@Override
public void success(Task task, Response response) {
//process your response if successful do what you want in your task
}
@Override
public void failure(RetrofitError retrofitError) {
retrofitError.printStackTrace(); //to see if you have errors
}
});
}
Надеюсь, это поможет вам, хотя на самом деле это самый простой способ использовать модификацию.
Ответ 3
Взгляните на этот отличный блог об использовании Retrofit в сочетании с Otto, обе библиотеки находятся на Square.
http://www.mdswanson.com/blog/2014/04/07/durable-android-rest-clients.html
Основная идея заключается в том, что вы будете ссылаться на объект "репозиторий" в своем классе Application. Этот объект будет иметь методы, которые "подписываются" на отдых для запросов api-событий. Когда кто-то будет получен, он сделает правильный повторный довод, а затем "отправит" ответ, который затем может быть "подписан" другим компонентом (например, деятельностью, сделавшей запрос).
Как только вы все это настроите правильно, доступ к данным через ваш ави api станет очень простым. Например, создание запроса данных будет выглядеть примерно так:
mBus.post(new GetMicropostsRequest(mUserId));
и потребление данных будет выглядеть примерно так:
@Subscribe
public void onGetUserProfileResponse(GetUserProfileResponse event) {
mView.setUserIcon("http://www.gravatar.com/avatar/" + event.getGravatar_id());
mView.setUserName(event.getName());
}
Это требует немного усилий, но в конечном итоге становится "тривиальным" доступ ко всему, что вам нужно, из нашего бэкэнда через Rest.
Ответ 4
Вы можете попытаться сохранить ссылки на свой api внутри вашего класса приложения. Затем вы можете получить экземпляр из любой активности или фрагмента и получить api оттуда. Это звучит немного странно, но это может быть простая альтернатива DI. И если вы будете хранить ссылки только в своем классе приложения, это не будет своего рода объект Бога
UPD: http://square.github.io/retrofit/ - вот некоторая документация, может быть полезно
Ответ 5
Использование RetroFit очень просто.
-
Добавить dependecy в build.gradle.
compile 'com.squareup.retrofit:retrofit:1.9.0'
compile 'com.squareup.okhttp:okhttp:2.4.0'
-
Создайте интерфейс для всех методов http.
-
Скопируйте свой json-выход и создайте класс pojo, чтобы получить json вашего сайта
ответ, вы можете сделать pojo из сайта JsonSchema2pojo.
-
сделайте адаптер и вызовите свой метод
для полной демонстрации попробуйте этот учебник обновите Android-пример
Ответ 6
Во-первых, помещение всего в MainActivity было бы плохой практикой, и вы получили бы объект God.
Документация на сайте "Дооснащение" - это фантастика, поэтому я собираюсь прочитать ваш вопрос о том, как структурировать проект. Я написал очень маленькое приложение для демонстрационных целей. Он загружает кошек из API кошки и должен быть довольно простым, чтобы следить за тем, что происходит.
В нем есть пример использования JSON или XML для анализа данных из службы. Вы можете найти его на https://github.com/codepath/android_guides/wiki/Consuming-APIs-with-Retrofit
Надеюсь, вы сможете экстраполировать, почему я структурировал его так, как я. Я рад ответить на любые ваши вопросы в комментариях и обновить ответ.
Ответ 7
Оформить заказ этого приложения, которое демонстрирует интеграцию Retrofit в API задач Google.
https://github.com/sschendel/SyncManagerAndroid-DemoGoogleTasks
Есть примеры Retrofit api (TaskApi), используемые в Activity AsyncTask в MainActivity, а также примеры использования в Sync Adapter в фоновом режиме.
Стратегия из статьи, опубликованной в ответе @nPn, вероятно, является более элегантным решением, но вы можете хотя бы взглянуть на другой рабочий пример.
Ответ 8
Я нахожу эти учебники AndroidHive, CodePath полезно
Я кратко опишу, что я узнал.
Шаг 1: Добавьте эти три dependencies to build.gradle
и Add Internet permission
в Manifest
compile 'com.google.code.gson:gson:2.6.2' // for string to class conversion. Not Compulsory
compile 'com.squareup.retrofit2:retrofit:2.1.0'// compulsory
compile 'com.squareup.retrofit2:converter-gson:2.1.0' //for retrofit conversion
Добавьте их в манифест
<uses-permission android:name="android.permission.INTERNET" />
Шаг 2
Creae ApiClient и ApiInterface.
public class ApiClient {
public static final String BASE_URL = "http://yourwebsite/services/";
private static Retrofit retrofit = null;
public static Retrofit getClient() {
if (retrofit==null) {
retrofit = new Retrofit.Builder()
.baseUrl(BASE_URL)
.addConverterFactory(GsonConverterFactory.create())
.build();
}
return retrofit;
}
}
где ApiInterface.class
public interface ApiInterface {
// getting same data in three different ways.
@GET("GetCompanyDetailByID")
Call<CompanyResponse> getDetailOfComapanies(@Query("CompanyID") int companyID);
@GET("GetCompanyDetailByID")
Call<ResponseBody> getRawDetailOfCompanies(@Query("CompanyID") int companyID);
@GET("{pathToAdd}")
Call<CompanyResponse> getDetailOfComapaniesWithPath(@Path("pathToAdd") String pathToAppend, @Query("CompanyID") int companyID);
}
И вызовите эту службу, например
ApiInterface apiService =
ApiClient.getClient().create(ApiInterface.class);
Call<CompanyResponse> companyResponseCall = apiService.getDetailOfComapanies(2);
//Call<CompanyResponse> companyResponseCall = apiService.getDetailOfComapaniesWithPath("GetCompanyDetailByID",2);
companyResponseCall.enqueue(new Callback<CompanyResponse>() {
@Override
public void onResponse(Call<CompanyResponse> call, Response<CompanyResponse> response) {
CompanyResponse comapnyResponse = response.body();
Boolean status = comapnyResponse.getStatus();
}
@Override
public void onFailure(Call<CompanyResponse> call, Throwable t) {
}
});
Для получения строки Raw Json
Call<ResponseBody> call = apiService.getRawDetailOfCompanies(2);
call.enqueue(new Callback<ResponseBody>() {
@Override
public void onResponse(Call<ResponseBody> call, Response<ResponseBody> response) {
String jsonStr = response.body().string();
if(!jsonStr.isEmpty()){
Gson gson = new Gson();
JSONObject jObject = new JSONObject(jsonStr).getJSONObject("data");
//1st Method
Data dataKiType = gson.fromJson(jObject.toString(), Data.class);
dataKiType.getCompanyDetail();
//2nd method for creaing class or List at runTime
Type listType = new TypeToken<Data>(){}.getType();
Data yourClassList = new Gson().fromJson(jObject.toString(), listType);
yourClassList.getCompanyDetail();
} e.printStackTrace();
}
}
@Override
public void onFailure(Call<ResponseBody> call, Throwable t) {
}
});
Вы можете создать свой бизнес-объект, используя http://www.jsonschema2pojo.org/, просто вставив json. и выбор типа источника для JSON и стиля аннотации для GSon
Ответ 9
Нашел небольшой, но полный и краткий пример
https://github.com/square/retrofit/tree/master/samples
Ответ 10
Начинающие находят это немного пугающим, чтобы изучить модернизацию. Я подготовил учебник, который упростит кривую обучения. Для получения дополнительной информации см. Обновление доисторического андроида.
Ответ 11
Сначала добавьте эти строки в файл gradle
compile 'com.squareup.retrofit2:retrofit:2.1.0'
compile 'com.squareup.retrofit2:converter-gson:2.1.0'
compile 'com.google.code.gson:gson:2.7'
compile 'com.squareup:otto:1.3.8'
compile 'com.squareup.okhttp3:logging-interceptor:3.4.1'
Затем создайте объекты в OnCreate of Activity
HttpLoggingInterceptor interceptor = new HttpLoggingInterceptor();
interceptor.setLevel(HttpLoggingInterceptor.Level.BODY);
OkHttpClient client= new OkHttpClient
.Builder()
.connectTimeout(30, TimeUnit.SECONDS)
.readTimeout(30, TimeUnit.SECONDS)
.addInterceptor(interceptor).build();
Gson gson=new GsonBuilder()
.setDateFormat("yyyy-MM-dd'T'HH:mm:ssZ")
.create();
Retrofit retrofit= new Retrofit.Builder()
.baseUrl("url")
.client(client)
.addConverterFactory(GsonConverterFactory.create(gson))
.build();
Создать iterface
public interface summaryListAPI {
//post
@FormUrlEncoded
@POST("index.php")
Call<summaryList> post(
@Field("status") String status,
@Field("sox") String sox
);
//get
@GET("yesbdeChatHistoryList/{userId}/")
Call<List<ChatTabTwoResp>> getFriends(
@Path("userId") int userId
);
}
Создание классов
public class summaryList {
@SerializedName("bookingSummary") @Expose private List<summaryListData> status = new ArrayList<summaryListData>();
}
public class summaryListData {
@SerializedName("date") @Expose private String date;
}
Добавьте этот метод в свою деятельность
public void apiSummaryListMain(final Retrofit retrofit) {
retrofit.create(summaryListAPI.class).post("8547861657","100").enqueue(new Callback<summaryList>() {
@Override
public void onResponse(Call<summaryList> call, Response<summaryList> response) {
if (response.isSuccessful()) {
progressBar.setVisibility(View.INVISIBLE);
List<summaryListData> summary_List= response.body().getStatus();
}else{
}
}
@Override
public void onFailure(Call<summaryList> call, Throwable t) {
}
});
}
Ответ 12
Работает
пакет com.keshav.gmailretrofitexampleworking.network;
import retrofit2.Retrofit;
import retrofit2.converter.gson.GsonConverterFactory;
public class ApiClient {
public static final String BASE_URL = "http://api.androidhive.info/json/";
private static Retrofit retrofit = null;
public static Retrofit getClient() {
if (retrofit == null) {
retrofit = new Retrofit.Builder()
.baseUrl(BASE_URL)
.addConverterFactory(GsonConverterFactory.create())
.build();
}
return retrofit;
}
}
==============================================
package com.keshav.gmailretrofitexampleworking.network;
import com.keshav.gmailretrofitexampleworking.models.Message;
import java.util.List;
import retrofit2.Call;
import retrofit2.http.GET;
public interface ApiInterface {
@GET("inbox.json")
Call<List<Message>> getInbox();
}
compile 'com.google.code.gson: gson: 2.6.2'
compile 'com.squareup.retrofit2:retrofit:2.0.2'
compile 'com.squareup.retrofit2:converter-gson:2.0.2'
=============================================== ======
Переадресация вызова 2 APi внутри onCreate
private void getInbox() {
swipeRefreshLayout.setRefreshing(true);
ApiInterface apiService =
ApiClient.getClient().create(ApiInterface.class);
Call<List<Message>> call = apiService.getInbox();
call.enqueue(new Callback<List<Message>>() {
@Override
public void onResponse(Call<List<Message>> call, Response<List<Message>> response) {
// clear the inbox
messages.clear();
// add all the messages
// messages.addAll(response.body());
// TODO - avoid looping
// the loop was performed to add colors to each message
Log.e("keshav","response" +response.body());
for (Message message : response.body()) {
// generate a random color
// TODO keshav Generate Random Color Here
message.setColor(getRandomMaterialColor("400"));
messages.add(message);
}
mAdapter.notifyDataSetChanged();
swipeRefreshLayout.setRefreshing(false);
}
@Override
public void onFailure(Call<List<Message>> call, Throwable t) {
Toast.makeText(getApplicationContext(), "Unable to fetch json: " + t.getMessage(), Toast.LENGTH_LONG).show();
swipeRefreshLayout.setRefreshing(false);
}
});
}
Исходный код
https://drive.google.com/open?id=0BzBKpZ4nzNzUVFRnVVkzc0JabUU
https://drive.google.com/open?id=0BzBKpZ4nzNzUc2FBdW00WkRfWW8
Ответ 13
Разработка собственной безопасной HTTP-библиотеки для интерфейса с REST API может быть настоящей болью: вам нужно обрабатывать многие аспекты, такие как создание соединений, кэширование, повторная попытка неудачных запросов, потоковая обработка, анализ ответов, ошибка обработки и т.д. С другой стороны, дооснащение - это хорошо спланированная, документированная и протестированная библиотека, которая сэкономит вам много драгоценного времени и головных болей.
compile 'com.google.code.gson: gson: 2.6.2'
compile 'com.squareup.retrofit2: retrofit: 2.1.0'//обязательный
compile 'com.squareup.retrofit2: converter-gson: 2.1.0'//для преобразования с преобразованием
Ответ 14
Я просто затормозил эту проблему очень просто, вам просто нужно установить плагин и выполнить некоторые шаги для внедрения модификации в любом из приложений.
Уже опубликованный ответ: Модернизация в андроиде?
Добавить (QAssist - Android Studio Plugin) Android-плагин в вашей студии Android. (https://github.com/sakkeerhussain/QAssist).
Надеюсь, это поможет вам.
Ответ 15
Простая модернизация + okhttp с использованием RxJava
public WebService apiService(Context context) {
String mBaseUrl = context.getString(BuildConfig.DEBUG ? R.string.local_url : R.string.live_url);
int cacheSize = 5 * 1024 * 1024; // 5 MB
Cache cache = new Cache(context.getCacheDir(), cacheSize);
HttpLoggingInterceptor loggingInterceptor = new HttpLoggingInterceptor();
loggingInterceptor.setLevel(BuildConfig.DEBUG ? HttpLoggingInterceptor.Level.BODY : HttpLoggingInterceptor.Level.NONE);
OkHttpClient okHttpClient = new OkHttpClient.Builder()
.readTimeout(120, TimeUnit.SECONDS)
.writeTimeout(120, TimeUnit.SECONDS)
.connectTimeout(120, TimeUnit.SECONDS)
.addInterceptor(loggingInterceptor)
//.addNetworkInterceptor(networkInterceptor)
.cache(cache)
.build();
return new Retrofit.Builder().baseUrl(mBaseUrl)
.client(okHttpClient)
.addConverterFactory(GsonConverterFactory.create())
.addCallAdapterFactory(RxJava2CallAdapterFactory.create())
.build().create(WebService.class);
}