RxJava 既不调用 onSuccess 也不调用 onError,应用冻结
RxJava not calling neither onSuccess nor onError, app freezing
当我第一次关闭互联网并滑动刷新时,一切正常(刷新禁用,并显示NetworkErrorView
),但是当我第二次滑动刷新时,刷新状态冻结,并且我在 SingleObserver
中理解既不调用 onSuccess
(因为互联网关闭,好吧),也不调用 onError
,后者应该调用因为互联网关闭,结果 doAfterTerminate
也没有调用.
顺便说一句,
dataManager.getCitiesFromDb()
return Observable(City)
和
dataManager.getCityConditionsResponse()
return Single(List(City))
MainActivity (onCreate)
presenter.setRefreshObservable(RxSwipeRefreshLayout.refreshes(swipeRefreshLayout));
主持人
@Override
public void setRefreshObservable(Observable<Object> observable) {
observable
.flatMapSingle(l -> getCitiesListObservable()
.flatMap(list -> Single.fromObservable(Observable.fromIterable(list)))
.map(city -> city))
.toList()
.subscribe(new SingleObserver<List<City>>() {
@Override
public void onSubscribe(Disposable d) {
disposables.add(d);
}
@Override
public void onSuccess(List<City> list) {
view.showCitiesList(list);
}
@Override
public void onError(Throwable e) {
view.showNetworkErrorView();
}
});
}
private Single<List<City>> getCitiesListObservable() {
return dataManager.getCitiesFromDb()
.flatMapSingle(city ->
dataManager.getCityConditionsResponse(city.getQuery())
.map(response -> {
city.setTemp(response.getTemp());
city.setIcon(response.getIcon());
return city;
})
)
.toList()
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.doAfterTerminate(() -> view.hideRefreshingStatus());
}
如果 observable 在 RxJava 中发出错误,它将被终止,因此您不能再使用该流。
在您的情况下,当您的网络请求(可能是 dataManager.getCityConditionsResponse
方法)由于互联网而给您错误时,您的流已中断。
要处理这个问题,您必须将 RxJava 的 onErrorReturn
添加到您的网络请求中才能不发出错误。因为,它不会向下游发出错误,您的流不会中断。最终,它可以继续发射更多的物品。
当我第一次关闭互联网并滑动刷新时,一切正常(刷新禁用,并显示NetworkErrorView
),但是当我第二次滑动刷新时,刷新状态冻结,并且我在 SingleObserver
中理解既不调用 onSuccess
(因为互联网关闭,好吧),也不调用 onError
,后者应该调用因为互联网关闭,结果 doAfterTerminate
也没有调用.
顺便说一句,
dataManager.getCitiesFromDb()
return Observable(City)
和
dataManager.getCityConditionsResponse()
return Single(List(City))
MainActivity (onCreate)
presenter.setRefreshObservable(RxSwipeRefreshLayout.refreshes(swipeRefreshLayout));
主持人
@Override
public void setRefreshObservable(Observable<Object> observable) {
observable
.flatMapSingle(l -> getCitiesListObservable()
.flatMap(list -> Single.fromObservable(Observable.fromIterable(list)))
.map(city -> city))
.toList()
.subscribe(new SingleObserver<List<City>>() {
@Override
public void onSubscribe(Disposable d) {
disposables.add(d);
}
@Override
public void onSuccess(List<City> list) {
view.showCitiesList(list);
}
@Override
public void onError(Throwable e) {
view.showNetworkErrorView();
}
});
}
private Single<List<City>> getCitiesListObservable() {
return dataManager.getCitiesFromDb()
.flatMapSingle(city ->
dataManager.getCityConditionsResponse(city.getQuery())
.map(response -> {
city.setTemp(response.getTemp());
city.setIcon(response.getIcon());
return city;
})
)
.toList()
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.doAfterTerminate(() -> view.hideRefreshingStatus());
}
如果 observable 在 RxJava 中发出错误,它将被终止,因此您不能再使用该流。
在您的情况下,当您的网络请求(可能是 dataManager.getCityConditionsResponse
方法)由于互联网而给您错误时,您的流已中断。
要处理这个问题,您必须将 RxJava 的 onErrorReturn
添加到您的网络请求中才能不发出错误。因为,它不会向下游发出错误,您的流不会中断。最终,它可以继续发射更多的物品。