为什么在Android上使用Retrofit的RxJava doOnError()不起作用,但是Subscriber onError会起作用

woj*_*ski 22 android subscriber rx-java retrofit rx-android

谁能解释我为什么这样的代码:

 networApi.getList()
            .subscribeOn(Schedulers.newThread())
            .observeOn(AndroidSchedulers.mainThread())
            .doOnError(throwable -> {
                throwable.getMessage();
            })
            .doOnNext(list -> {
                coursesView.populateRecyclerView(list);
                courseList = (List<Course>) courses;
            }).subscribe();
Run Code Online (Sandbox Code Playgroud)

如果没有互联网进入doOnError但是进一步抛出它以便应用程序关闭,但代码如下:

networkApi.getList()
            .subscribeOn(Schedulers.newThread())
            .observeOn(AndroidSchedulers.mainThread())
            .subscribe(new Subscriber<List<? extends Course>>() {
                @Override
                public void onCompleted() {

                }

                @Override
                public void onError(Throwable e) {
                    e.getMessage();
                }

                @Override
                public void onNext(List<? extends Course> list) {
                    coursesView.populateRecyclerView(list);
                    courseList = (List<Course>) list;
                }
            });
Run Code Online (Sandbox Code Playgroud)

按照我的预期工作,这意味着当没有互联网连接时,它什么都不做.

dav*_*ola 40

基本上,doOnError处理错误,因为它不消耗它.它只是对它做了一些事情,例如记录它.(同样的是真实的doOnNext-它也不会消耗项目,该项目仍处于最终onNextSubscriber).

错误仍然在链中发送,并且仍然会在onError您的链中发送Subscriber.

我很确定你的应用程序崩溃了OnErrorNotImplementedException,这是因为你根本没有任何方法Subscriber,因此没有onError方法.

  • @JhonFredyTrujilloOrtega:除了伐木,不是真的.将它用于UI更新很有诱惑力(当网络请求发出`onError`时隐藏进度指示器),但请参阅Jake Wharton的谈话http://jakewharton.com/the-state-of-managing-state-with-rxjava/一个更清洁的替代品,不使用`doOn*`方法. (2认同)