RxJava取消对'Single.fromCallable'的请求,可丢弃.clear导致InterruptedIOException

时间:2018-10-24 07:27:37

标签: android rx-java rx-java2

我在我的应用程序中将RxJava和AWS API Gateway一起使用。

代码在这里:

Object

问题是,当用户在搜索过程中更改文本的频率过高并且api调用已在进行中时,我想在发送新匹配之前取消先前的调用,因为由于查询更改,我不希望对先前匹配做出响应。

我也尝试使用disabled.cancel,但它给出了错误

public boolean equals(Object obj)

我如何实现我的目标以保存我的匹配?任何想法都是可以理解的。

谢谢

1 个答案:

答案 0 :(得分:1)

某些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();
    }
});