gpt4 book ai didi

android - RxJava 取消 'Single.fromCallable' 请求,disposable.clear 导致 InterruptedIOException

转载 作者:行者123 更新时间:2023-11-29 00:58:18 30 4
gpt4 key购买 nike

我在我的应用程序中使用 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 调用已经在进行中时,我想在发送新匹配之前取消之前的调用,因为我不希望由于查询更改而响应之前的匹配。

我也尝试过使用 disposable.cancel 但它给出了错误

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

我怎样才能实现我的目标来保存我的点击?任何想法都将是可观的。

谢谢

最佳答案

某些 API 通过抛出无法中继的异常来响应取消。如果这样的崩溃是一致的,比如你总是从这样的 API 中得到 InterruptedIOException,你可以专门忽略这样的异常,因此 RxJava 不会知道它们。

这有点难以通过 fromCallable 实现,因为您必须返回非空值,但您可能无法创建所涉及类型的实例。因此,我建议使用 create:

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

编辑 如果您可以创建 ±n SearchResponse,您可以继续使用 fromCallable:

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

关于android - RxJava 取消 'Single.fromCallable' 请求,disposable.clear 导致 InterruptedIOException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52963201/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com