RxJava не вызывает ни onSuccess, ни onError, зависание приложения - PullRequest
0 голосов
/ 17 октября 2018

Когда я выключил Интернет и проведу пальцем, чтобы обновить в первый раз, все работает нормально (отключение обновления и отображение NetworkErrorView), но когда я проведу пальцем, чтобы обновить во второй раз, обновление состояния зависает и, как я понимаю, в SingleObserver не звонит ни onSuccess (потому что интернет отключен, хорошо), ни 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());
}

1 Ответ

0 голосов
/ 17 октября 2018

Если наблюдаемая выдает ошибку в RxJava, она прекращается, поэтому вы больше не можете использовать этот поток повторно.
Здесь, в вашем случае, когда ваш сетевой запрос (вероятно, dataManager.getCityConditionsResponse метод) выдает ошибку из-за Интернета, ваш поток прерывается.
Чтобы справиться с этим, вы должны добавить RxJava onErrorReturn к вашему сетевому запросу, чтобы не выдавать ошибку.Так как он не выдаст ошибку в нисходящий поток, ваш поток не будет прерван.В конце концов, он может продолжать излучать больше предметов.

...