>

인터넷을 끄고 처음으로 스 와이프하여 새로 고침하면 모든 것이 정상적으로 작동합니다 (새로 고침 비활성화 및 NetworkErrorView 표시) ), 그러나 두 번째로 새로 고치려면 새로 고침 상태를 새로 고침하고 SingleObserver 에서 이해하는 것처럼   onSuccess 를 호출하지 않음  (인터넷이 끊어 졌기 때문에) 또는 onError 인터넷이 꺼져 있기 때문에 전화해야합니다. 결과적으로 doAfterTerminate  또한 전화하지 않습니다.

그런데

dataManager.getCitiesFromDb()   Observable(City) 를 반환   과 dataManager.getCityConditionsResponse()   Single(List(City)) 를 반환

주요 활동 (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());
}

  • 답변 # 1

    RxJava에서 Observable이 오류를 발생 시키면 종료되어 더 이상 해당 스트림을 재사용 할 수 없습니다.
    귀하의 경우 네트워크 요청 (아마도 dataManager.getCityConditionsResponse )  방법) 인터넷으로 인해 오류가 발생하여 스트림이 손상되었습니다.
    이를 처리하려면 RxJava의 onErrorReturn 를 추가해야합니다.  네트워크 요청에 오류가 발생하지 않습니다. 다운 스트림에 오류가 발생하지 않으므로 스트림이 중단되지 않습니다. 결국 더 많은 항목을 계속 내보낼 수 있습니다.

  • 이전 백엔드 용 iOS 자격 증명 용 Google 로그인 API (Swift)
  • 다음 pandas - 파이썬 그래프 날짜 * 수량