Как обработать объект в методе Retrofit onFailure? - PullRequest
0 голосов
/ 16 апреля 2020

Я создал метод, который отправляет объект на сервер. Если отправка завершается неудачно и переходит в метод onFailure, я хочу вставить объект в базу данных, чтобы попытаться отправить его при наличии соединения.

Когда я вызываю метод один раз, он работает нормально, но когда я делаю несколько вызовов подряд, onFailure всегда содержит последний объект, который я передал ему в качестве параметра, а остальные теряются.

public void sendPerson(final Context ctx, final Person person, final boolean requiresInsert){

        WebService.getInstance()
                .createService(WebServiceAPI.class)
                .sendPersonAPI(person)
                .enqueue(new Callback<Person>() {
                    @Override
                    public void onResponse(Call<Person> call, Response<Person> response) {
                        Log.d(TAG, "Post successful - " + response.toString());

                        if (response.code() != 201 && requiresInsert){
                            String textForMd5 = new Gson().toJson(person);
                            handlerDB = new HandlerDB();
                            handlerDB.insertDB(ctx, person, HashMD5.md5(textForMd5));
                        } 
                    }

                    @Override
                    public void onFailure(Call<Person> call, Throwable t) {
                        Log.d(TAG, "Post failure - " + Objects.requireNonNull(t.getMessage()));

                        if (requiresInsert){
                            String textForMd5 = new Gson().toJson(person);
                            handlerDB = new HandlerDB();
                            handlerDB.insertDB(ctx, person, HashMD5.md5(textForMd5));
                        }
                    }
                });
    }

Это интерфейс

public interface WebServiceAPI {

    @POST("/person")
    Call<Person> sendPersonAPI(@Body Person Person);
    }

А вот мой класс WebService

public class WebService {

    //private static final String BASE_URL = "http://2905.multimedia-advisor.info:18001";

    private static WebService instance;
    private Retrofit retrofit;
    private HttpLoggingInterceptor httpLoggingInterceptor;
    private OkHttpClient.Builder httpClientBuilder;



    //Constructor
    private WebService(){
        //Show the request and response information
        httpLoggingInterceptor = new HttpLoggingInterceptor().setLevel(HttpLoggingInterceptor.Level.BODY);
        httpClientBuilder = new OkHttpClient.Builder().addInterceptor(httpLoggingInterceptor);

        retrofit = new Retrofit.Builder()
                .baseUrl(AppConfig.BASE_URL)
                .client(httpClientBuilder.build())
                .addConverterFactory(GsonConverterFactory.create())
                .build();
    }

    //La etiqueta syncronized se asegura que solo haya una instancia.
    public static synchronized WebService getInstance(){
        if (instance == null){
            instance = new WebService();
        }
        return instance;
    }

    public <S> S createService(Class<S> serviceClass){

        return retrofit.create(serviceClass);
    }
}
...