rx-java - 通过 RxJava 发送异常时崩溃

标签 rx-java rx-android

我开始使用 RXAndroid,并且我已经发布了我的第一个测试版,但我遇到了一个我没想到的异常。我确定这是因为我对 onError 的方式缺乏了解。方法有效。

我的代码是这样的:

disposables.add(Observable.create(new ObservableOnSubscribe<String>() {
                    @Override
                    public void subscribe(@NonNull ObservableEmitter<String> e) throws Exception {
                        if (e.isDisposed()) {
                            return;
                        }
                        //do stuff
                        if (stuff didn't fail) {
                            e.onNext(myString);
                        } else {
                            e.onError(new Exception("stuff failed"));
                        }
                        e.onComplete();
                    }


                })
                        .subscribeOn(Schedulers.io())
                        .observeOn(AndroidSchedulers.mainThread())
                        .subscribeWith(new DisposableObserver<String>() {
                            @Override
                            public void onNext(@NonNull String myString) {
                                //do stuff

                            }

                            @Override
                            public void onError(@NonNull Throwable e) {
                                //handle the error
                            }

                            @Override
                            public void onComplete() {
                            }
                        })
        );

我在这里遇到了崩溃:
e.onError(new Exception("stuff failed"));
但我个人认为这会处理这种情况吗?
public void onError(@NonNull Throwable e) {
    //handle the error
}

我已经更改了我的代码以不同的方式处理这个问题,但我仍然想知道如何 onError应该工作。

谢谢你。

编辑:异常(exception):
java.lang.Exception: stuff failed
       at io.reactivex.plugins.RxJavaPlugins.onError(RxJavaPlugins.java:349)
       at io.reactivex.internal.operators.observable.ObservableCreate$CreateEmitter.onError(ObservableCreate.java:83)
       at MyClass$4.subscribe(MyClass.java:295)
       at io.reactivex.internal.operators.observable.ObservableCreate.subscribeActual(ObservableCreate.java:40)
       at io.reactivex.Observable.subscribe(Observable.java:10842)
       at io.reactivex.internal.operators.observable.ObservableSubscribeOn$SubscribeTask.run(ObservableSubscribeOn.java:96)
       at io.reactivex.Scheduler$DisposeTask.run(Scheduler.java:452)
       at io.reactivex.internal.schedulers.ScheduledRunnable.run(ScheduledRunnable.java:61)
       at io.reactivex.internal.schedulers.ScheduledRunnable.call(ScheduledRunnable.java:52)
       at java.util.concurrent.FutureTask.run(FutureTask.java:237)
       at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:272)
       at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1133)
       at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:607)
       at java.lang.Thread.run(Thread.java:762)
Caused by java.lang.Exception: stuff failed
       at MyClass$4.subscribe(MyClass.java:295)
       at io.reactivex.internal.operators.observable.ObservableCreate.subscribeActual(ObservableCreate.java:40)
       at io.reactivex.Observable.subscribe(Observable.java:10842)
       at io.reactivex.internal.operators.observable.ObservableSubscribeOn$SubscribeTask.run(ObservableSubscribeOn.java:96)
       at io.reactivex.Scheduler$DisposeTask.run(Scheduler.java:452)
       at io.reactivex.internal.schedulers.ScheduledRunnable.run(ScheduledRunnable.java:61)
       at io.reactivex.internal.schedulers.ScheduledRunnable.call(ScheduledRunnable.java:52)
       at java.util.concurrent.FutureTask.run(FutureTask.java:237)
       at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:272)
       at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1133)
       at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:607)
       at java.lang.Thread.run(Thread.java:762)

最佳答案

检查之间 e.isDisposed()和您调用 e.onError()发射器最终以某种方式被处置。这会导致调用 onError回退到全局错误处理程序。

您需要查看e.isDisposed()再次,或者如果您愿意使用实验性功能,RxJava 2.1.1 添加了 e.tryOnError如果它已经被处理,则不会回退的方法。

关于rx-java - 通过 RxJava 发送异常时崩溃,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44420422/

相关文章:

stream - RxJava - 将 Observable 转换为迭代器、流或序列

asynchronous - Observer.onNext 中的 RxJava/RxScala 异步代码

android - OkHttp 上的不平衡进入/退出

java - Concat 不同类型的 Observable

java - RxJava - 合并 2 个调用

android - Realm 、RxJava、asObservable() 和 doOnUnsubscribe()

android - RxAndroid ViewObservable NetworkOnMainThreadException

Android 无法解析 rxjava 中的订阅方法

android - 为什么 Observable 没有在正确的线程上创建?

java - Dagger2+Retrofit 更改子组件的 URL : cannot be provided without an @Provides- or @Produces-annotated method