RxJava:即使发生错误也继续下一次迭代
RxJava: Continue next iteration even if error occurs
我正在使用 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()
以便在新查询的结果到达时忽略旧查询的结果。
您必须处理此错误并 return 一个对象。例如,您可以通过将 onErrorResumeNext 运算符与 apiService.getSearchResults(query)
调用一起使用来实现。你要做什么 return - 取决于你,你甚至可以 return 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 的简单示例,实际上您需要编写错误处理逻辑。最好是 return 包装器,因为如果使用 RxJava 2
,那么它不支持 null
。
我正在使用 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()
以便在新查询的结果到达时忽略旧查询的结果。
您必须处理此错误并 return 一个对象。例如,您可以通过将 onErrorResumeNext 运算符与 apiService.getSearchResults(query)
调用一起使用来实现。你要做什么 return - 取决于你,你甚至可以 return 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 的简单示例,实际上您需要编写错误处理逻辑。最好是 return 包装器,因为如果使用 RxJava 2
,那么它不支持 null
。