Запрос отмены RxJava для 'Single.fromCallable', одноразового.чистого вызвал InterruptedIOException - PullRequest
0 голосов
/ 24 октября 2018

Я использую RxJava вместе с AWS API Gateway в своем приложении.

Код здесь:

    @Override
    public Single<SearchResponse> searchPostsApiCall(String keyword, String offset) {
        return Single.fromCallable(() -> client.postSearch(keyword,offset));
    }

// to call api
getCompositeDisposable().add(searchPostsApiCall(keyword,offset)
                .subscribeOn(getSchedulerProvider().io())
                .observeOn(getSchedulerProvider().ui())
                .subscribe(response -> onResponseReceived(response, offset, finalType), this::onError)
        );

Проблема в том, что когда пользователь во время поиска слишком часто меняет текст и вызов API уже выполняется, я хочу отменить предыдущий вызов перед отправкой нового хитатак как я не хочу получать ответ от предыдущего попадания из-за измененного запроса.

Я тоже пытался использовать одноразовый.cancel, но он выдает ошибку

'ApiClientException: java.io.InterruptedIOException: thread interrupted'

Как мне достичь своей цели, чтобы сохранить мойхиты?Любая идея будет заметна.

Спасибо

1 Ответ

0 голосов
/ 24 октября 2018

Некоторые API реагируют на отмену, генерируя исключение, которое не может быть передано.Если такие сбои непротиворечивы, например, вы всегда получаете InterruptedIOException от таких API, вы можете специально игнорировать такие исключения и, следовательно, RxJava не будет знать о них.

Этого несколько трудно достичь с помощью fromCallableтак как вы должны вернуть что-то ненулевое, но вы не сможете создать экземпляр соответствующего типа.Поэтому я предлагаю использовать create:

Single.create(emitter -> {
    try {
        emitter.onSuccess(client.postSearch(keyword,offset));
    } catch (InterruptedIOException ex) {
        // ignore
    } catch (Throwable ex) {
        emitter.onError(ex);
    }
});

Edit Если вы можете создать ąn SearchResponse, вы можете остаться с fromCallable:

Single.fromCallable(() -> {
    try {
        return client.postSearch(keyword,offset);
    } catch (InterruptedIOException ex) {
         // fromCallable won't actually emit this
        return new SearchResponse();
    }
});
...