Обработка ошибок RxJava не позволила проглотить ошибку - PullRequest
0 голосов
/ 21 октября 2018

Я немного новичок в RxJava.Я пытаюсь создать другой элемент, если onError () вызывается без потери ошибки (я все еще хочу, чтобы onError () вызывался для наблюдателя).но когда я реализую каждый из методов обработки ошибок, объявленных в документах , ошибка проглатывается и при ошибке не вызывается.какие-либо решения?

редактировать: это то, что я пытался сделать вчера -

@Override
public Observable<ArrayList<Address>> getAirports() {
    return new Observable<ArrayList<AirportPOJO>>() {
        @Override
        protected void subscribeActual(Observer<? super ArrayList<AirportPOJO>> observer) {
            try {
                // get airports from api list and map it
                ArrayList<AirportPOJO> airportsList = apiDb.getAirportsList(POJOHelper.toPOJO(AppCredentialManager.getCredentials()));
                observer.onNext(airportsList);
            } catch (Exception e) {
                e.printStackTrace();
                observer.onError(handleException(e));
            }
        }
    }.map(AirportsMappers.getAirportsPojoToDomainAirportsMapper()).doOnNext(new Consumer<ArrayList<Address>>() {
        @Override
        public void accept(ArrayList<Address> airportsList) throws Exception {
            // if airports loaded from api - save them to local db
            if (airportsList != null) {
                try {
                    localDb.saveAirportList(AirportsMappers.getAirportsToLocalDbAirportsMapper().apply(airportsList));
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        }
    }).onErrorResumeNext(new Function<Throwable, ObservableSource<? extends ArrayList<Address>>>() {
        @Override
        public ObservableSource<? extends ArrayList<Address>> apply(final Throwable throwable) throws Exception {
            // load the local airports - 
            ArrayList<LocalDbAirportEntity> localAirportsEntities = localDb.getAirports();
            // map
            ArrayList<Address> airports = AirportsMappers.getLocalDbAirportsToAirportsMapper().apply(localAirportsEntities);
            // return the concat observable with the error
            return Observable.just(airports).concatWith(Observable.
                    <ArrayList<Address>>error(new Callable<Throwable>() {
                        @Override
                        public Throwable call() throws Exception {
                            return throwable;
                        }
                    }));
        }
    });
}

сегодня я подумал, что могу сделать это неправильно и попытался -

@Override
public Observable<ArrayList<Address>> getAirports() {
    ArrayList<Observable<ArrayList<Address>>> observables = new ArrayList<>();
    observables.add(apiDb.getAirportsList(POJOHelper.toPOJO(AppCredentialManager.getCredentials())).map(AirportsMappers.getAirportsPojoToDomainAirportsMapper()));
    observables.add(localDb.getAirports().map(AirportsMappers.getLocalDbAirportsToAirportsMapper()));
    Observable<ArrayList<Address>> concatenatedObservable = Observable.concatDelayError(observables);
    return concatenatedObservable;
}

но у меня такой же результат.onNext () вызывается с данными второй наблюдаемой и onError () не вызывается впоследствии.

1 Ответ

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

Возобновить с желаемым значением, объединенным с исходной ошибкой:

source.onErrorResumeNext(error ->
    Observable.just(item).concatWith(Observable.<ItemType>error(error))
);
...