我正在使用RxSearchView
将搜索结果从API发布到recyclerview。但是,如果其中一个查询失败,则会调用onError()
(这是预期的),但整个订阅也会被取消。根本不会执行后续查询。
我应该如何修改代码,以便在查询失败并且正常执行下一个传入查询时阻止对onError()
的调用?
以下是代码段:
subscription = RxSearchView.queryTextChanges(searchView)
.debounce(500, MILLISECONDS)
.filter(charSequence -> !TextUtils.isEmpty(charSequence))
.map(CharSequence::toString)
.subscribeOn(AndroidSchedulers.mainThread())
.observeOn(Schedulers.io())
.switchMap(query -> apiService.getSearchResults(query))
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new Subscriber<SearchResponse>() {
@Override
public void onCompleted() {
}
@Override
public void onError(Throwable e) {
}
@Override
public void onNext(SearchResponse searchResponse) {
if (searchResponse.getStatus().equals("OK")) {
//update Adapter
} else {
//update error views
}
}
});
P.S:我正在使用switchMap()
,以便在新查询的结果到达时忽略旧查询的结果。
答案 0 :(得分:1)
您必须处理此错误并返回对象。例如,您可以通过onErrorResumeNext运算符使用apiService.getSearchResults(query)
调用来执行此操作。您要返回的内容 - 取决于您,如果您愿意,您甚至可以返回null
,但最好创建一个包含响应状态标记和正常响应的包装器(如果收到)。
类似的东西:
subscription = RxSearchView.queryTextChanges(searchView)
.debounce(500, MILLISECONDS)
.filter(charSequence -> !TextUtils.isEmpty(charSequence))
.map(CharSequence::toString)
.subscribeOn(AndroidSchedulers.mainThread())
.observeOn(Schedulers.io())
.switchMap(query -> apiService
.getSearchResults(query)
.onErrorResumeNext(error -> null)
)
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new Subscriber<SearchResponse>() {
@Override
public void onCompleted() {
}
@Override
public void onError(Throwable e) {
}
@Override
public void onNext(SearchResponse searchResponse) {
if (searchResponse != null && searchResponse.getStatus().equals("OK")) {
//update Adapter
} else {
//update error views
}
}
});
当然,这是使用null的简单示例,实际上您需要编写错误处理逻辑。最好返回包装器,因为如果使用RxJava 2
,则它不支持null
。