Подтвердить что ты не робот

Использование Retrofit в Android

У меня есть приложение для Android, которое имеет 3 действия:

  1. Активность входа в систему
  2. Выполнение задач, в которых отображаются все задачи, относящиеся к пользователю (заполняется с использованием адаптера массива)
  3. Активность task_details, которая возникает при нажатии задачи в списке

Я должен использовать REST Apis. Исследование, которое я сделал до сих пор, направляет меня на использование Retrofit. Я проверил, как его использовать, и выяснил, что:

  1. Задайте базовый URL-адрес в основной деятельности (Mine - это активность входа)
  2. Мне нужно создать класс API и определить мои функции с помощью аннотаций.
  3. Используйте Адаптер отдыха класса в Управлении и определите Обратные вызовы.

Если бы мое приложение было одним активным приложением, я бы все хрустнул в моем 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();
            }
        });
    }
4b9b3361

Ответ 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

Ответ 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);

}