RxAndroid虽然实现了doOnError,但仍导致应用崩溃

3
我有以下代码。基本上是尝试将特定SQLite表中的所有数据发送到DynamoDB:
Observable.create(new Observable.OnSubscribe<Area>() {
    @Override
    public void call(Subscriber<? super Area> subscriber) {
        try {
            for (Area item : areaDao.listAll()) {
                subscriber.onNext(item);
            }
            subscriber.onCompleted();
        } catch (Exception e) {
            subscriber.onError(e);
        }
    }
}).flatMap(new Func1<Area, Observable<Area>>() {
    @Override
    public Observable<Area> call(Area area) {
        dynamoDBMapper.save(area);
        return Observable.just(area);
    }
}).observeOn(
        AndroidSchedulers.mainThread()
).doOnError(new Action1<Throwable>() {
    @Override
    public void call(Throwable throwable) {
        Log.w("AreaHandler", "Could not upload area", throwable);
    }
}).doOnCompleted(new Action0() {
    @Override
    public void call() {
        Toast.makeText(ctx, R.string.toast_upload_successful, Toast.LENGTH_SHORT).show();
    }
}).subscribeOn(
        Schedulers.io()
).subscribe(new Action1<Area>() {
    @Override
    public void call(Area area) {
        areaDao.delete(area.getId());
    }
});

我试图在禁用网络连接的模拟器上运行它,然而 Dynamo 客户端会进行几次(失败的)重试,然后抛出异常并崩溃应用程序。从文档中了解到,该异常应被 doOnError 捕获而不是被放任自流导致进程被终止。请问我错过了什么?
1个回答

4
您正在错误的地方捕获错误。 doOnError 用于副作用,不处理错误。
选项1:传入两个Action1。
Observable.just(1, 2, 3)
            .subscribe(
                    new Action1<Integer>() {
                        @Override
                        public void call(Integer integer) {
                            System.out.println(integer);
                        }
                    },
                    new Action1<Throwable>() {
                        @Override
                        public void call(Throwable throwable) {
                            System.err.print(throwable);
                        }
                    });

选项2:传递一个观察者。
    Observable.just(1, 2, 3)
            .subscribe(new Observer<Integer>() {
                @Override
                public void onCompleted() {

                }

                @Override
                public void onError(Throwable throwable) {
                    System.err.print(throwable);
                }

                @Override
                public void onNext(Integer integer) {
                    System.out.println(integer);
                }
            });

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接