代码之家  ›  专栏  ›  技术社区  ›  Ofek Regev

RxJava错误处理,应忽略错误

  •  0
  • Ofek Regev  · 技术社区  · 6 年前

    我对RXJava有点陌生。如果调用on error()而不丢失错误(我仍然希望对观察者调用on error(),那么我将尝试发出另一个项。但是,当我实现中声明的每个错误处理方法时, docs 不会调用正在吞食和出错的错误。有什么解决办法吗?

    编辑: 我昨天就是这么做的-

    @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 回复  |  直到 6 年前
        1
  •  1
  •   akarnokd    6 年前

    继续使用与原始错误连接的所需值:

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