为什么在Android上使用RxJava和Retrofit时,doOnError()不起作用,但Subscriber的onError可以?

24

有人能解释一下为什么这样的代码:

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

如果没有网络进入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;
                }
            });

按照我的期望,工作应该是在没有网络连接时不会执行任何操作。

1个回答

43

基本上,doOnError并不会处理错误,它不会消费错误。它只是对错误执行一些操作,例如记录日志。(同样适用于doOnNext-它也不会消费项目,并且该项目仍然出现在SubscriberonNext中)。

错误仍将通过链传递,并最终出现在您的SubscriberonError中。

我非常确定您的应用程序将崩溃并显示一个OnErrorNotImplementedException,因为您根本没有任何Subscriber,因此没有onError方法。


@david.mihola,使用Retrofit beta 2是否有处理HTTP状态码onError的方法? - halfred
1
是的,它可以工作,但为什么呢?我不清楚为什么 doOnError 不起作用。你能给一个好的 doOnError 使用示例吗? - Jhon Fredy Trujillo Ortega
2
@JhonFredyTrujilloOrtega:除了日志记录之外,实际上没有。虽然在UI更新方面使用它很诱人(当网络请求发出“onError”时隐藏进度指示器),但请参阅Jake Wharton的演讲http://jakewharton.com/the-state-of-managing-state-with-rxjava/,以获取更清晰的替代方案,而不使用“doOn *”方法。 - david.mihola

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