Возврат Callable из модифицированного метода на Android - PullRequest
0 голосов
/ 02 февраля 2019

Это мой метод при модернизации:

@GET("comments")
Callable<List<Comments>> getCommentsRx();

Я создал класс Thread для Rxjava:

public static <T> Disposable async(Callable<List<T>> task, Consumer<List<T>> finished, Consumer<Throwable> onError) {
        return async(task, finished, onError, Schedulers.io());
    }

public static <T> Disposable async(Callable<List<T>> task, Consumer<List<T>> finished,
                                   Consumer<Throwable> onError, Scheduler scheduler) {
    finished = finished != null ? finished
            : (a) -> {
    };
    onError = onError != null ? onError
            : throwable -> {
    };

    return Single.fromCallable(task)
            .subscribeOn(scheduler)
            .observeOn(AndroidSchedulers.mainThread())
            .subscribe(finished, onError);
}

У меня есть метод loadjson для извлечения данных из сети:

private void loadJson(Consumer<List<Comments>> finished) {

    Threading.async(() -> fetchingServer(),finished,null);
}

private List<Comments> fetchingServer() {
    JsonplaceholderService service =
            ServiceGenerator.createService(JsonplaceholderService.class);

    try {
        return service.getCommentsRx().call();
    } catch (Exception e) {
        e.printStackTrace();
    }
    return null;
}

но я получил ошибку в методе fetchingServer.

java.lang.IllegalArgumentException: невозможно создать адаптер вызова для java.util.concurrent.Callable> для метода JsonplaceholderService.getCommentsRx

1 Ответ

0 голосов
/ 05 февраля 2019

Retrofit не имеет адаптеров для Callable, и вы не можете использовать его в своем методе @GET.

Вы можете использовать:

  1. RxJava2 Observable, Flowable, Single, Completable & Maybe,

  2. Java 8 CompletableFuture

  3. Дооснащение Call

Итак, вы можете сделать что-то вроде этого:

@GET("comments")
Observable<List<Comments>> getCommentsRx(); //rx observable, not java.util.observable

В вашем клиенте:

  service.getCommentsRx()
        .subscribeOn(scheduler)
        .observeOn(AndroidSchedulers.mainThread())
        .subscribe(finished, onError)
...