web-dev-qa-db-ja.com

レトロフィットをオンにしたRxJava Android doOnError()は機能しないが、サブスクライバーonErrorは機能する理由

誰かが私になぜこのようなコードを説明できますか?

 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;
                }
            });

私が期待するように動作します。つまり、インターネット接続がない場合は何もしません。

23

基本的に、doOnErrorはエラーをconsumeしないという意味で、エラーをhandleしません。それはただそれで何かをします、例えばそれを記録します。 (同じことがdoOnNextにも当てはまります。アイテムも消費せず、アイテムはonNextSubscriberになります)。

エラーは引き続きチェーンに送信され、最終的にはonErrorSubscriberになります。

アプリがOnErrorNotImplementedExceptionでクラッシュしていることは間違いありません。これは、Subscriberがまったくないため、onErrorメソッドがないためです。

41
david.mihola