Как асинхронно вернуть любой объект из модифицированного (не может вызвать метод enqueue ()) - PullRequest
0 голосов
/ 11 апреля 2020

Я хочу вернуть GetCheapestResponseType объект из Retrofit (асинхронно вызванный) с Rx Java:

Это мой метод:

public Single<GetCheapestResponseType> getCheapest(...) {

        ...

        OkHttpClient.Builder httpClient = new OkHttpClient.Builder();
        Retrofit retrofit = new Retrofit.Builder()
                .baseUrl(urlGetCheapest)
                .addConverterFactory(GsonConverterFactory.create())
                .client(httpClient.build())
                .build();

        Controller controller = retrofit.create(Controller.class);

        Call<GetCheapestResponseType> callAsync = controller.getCheapest(...);

        callAsync.enqueue(new Callback<GetCheapestResponseType>() {
            @SneakyThrows
            @Override
            public void onResponse(Call<GetCheapestResponseType> call, Response<GetCheapestResponseType> response) {
                    ...
                    // return GetCheapestResponseType; ??
            }

            @Override
            public void onFailure(Call<GetCheapestResponseType> call, Throwable throwable) {
                 //  return throwable; ??
            }
        });
    }

Итак, я сделал * 1007 Интерфейс * GetCheapestCallbacks :

public interface GetCheapestCallbacks {

    void onSuccess(@NonNull String result);

    void onError(@NonNull Throwable result);
}

Я добавил его в качестве параметра для getCheapest(... , @Nullable GetCheapestCallbacks callbacks)) метода

и onResponse() метода, который я добавил:

calbacks.onSuccess(...);

и onFailure() метод, который я добавил:

callbacks.onError(throwable);

В интерфейсе контроллера у меня есть:

public interface Controller {

    @GET("oneWayFares")
    public Single<GetCheapestResponseType> getCheapest(...);

}

Я изменил:

Call<GetCheapestResponseType> callAsync = controller.getCheapest(...);

Для:

Single<GetCheapestResponseType> callAsync = controller.getCheapest(...);

А теперь я не могу вызвать enqueue() метод для него.

Как заставить его работать?

1 Ответ

0 голосов
/ 11 апреля 2020

Ранее ваш тип возврата был Call<>. Класс Call - это класс, который предоставляет вам метод enqueue() для выполнения вызова API. Поскольку теперь вы возвращаете Single<>, есть смысл, что enqueue() больше не является опцией.

Я никогда много не работал с Rx Java с тех пор, как появилась LiveData. Но насколько я помню, вызов API выполняется , как только вы подписываетесь на Single . Другими словами: только вызов getCheapest() ничего не делает, если к этому Single

не подключен подписчик, поэтому что-то вроде этого должно работать:

controller.getCheapest(...).observeOn(AndroidSchedulers.mainThread()).subscribe(
   // implement success and error methods
)

Редактировать: я могу настоятельно рекомендую прочитать «Реактивное программирование на Android» Кристофера Арриолы и Ангуса Хуанга. Он очень хорошо структурирован и очень помог мне понять концепцию реактивных структур.

...