3

当我第一次关闭互联网并滑动刷新时,一切正常(刷新禁用和显示NetworkErrorView),但是当我第二次滑动刷新时,刷新状态冻结,据我所知,SingleObserver两者都没有调用onSuccess(因为互联网关闭, 好吧), nor onError, 应该打电话因为互联网关闭, 结果doAfterTerminate也没有打电话。

顺便一提,

dataManager.getCitiesFromDb()返回Observable(City)dataManager.getCityConditionsResponse()返回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());
}
4

1 回答 1

3

如果一个 observable 在 RxJava 中发出错误,它会被终止,因此你不能再重用该流。
在您的情况下,当您的网络请求(可能是dataManager.getCityConditionsResponse方法)由于互联网而给您错误时,您的流被破坏了。
要处理这个问题,您必须将 RxJava 添加onErrorReturn到您的网络请求中以不发出错误。由于它不会向下游发出错误,因此您的流不会被破坏。最终,它可以继续发射更多的项目。

于 2018-10-17T09:01:21.797 回答