我使用RxJava在后台运行http操作。我使用生命周期转换器来避免 Activity 完成时发生事件(最初是Trellos RxLifeCycle,现在我正在尝试AutoDispose)。我的问题是,如果 Activity 完成,然后后台作业引发异常,那么我得到一个异常,该异常使RxJava的应用程序崩溃。

问题是:是否可以使用生命周期提供程序(AutoDispose),并且仍然处理生产者引发的异常,从而避免RxJava将其传播到主线程并杀死应用程序?

下面的代码等待 Activity 停止,然后引发异常。除非删除AutoDispose行,否则Android应用程序将崩溃。

 Observable.create(e -> {
            // Wait for life cycle to see my activity is stopped, then throw simulation IOException
            while (!stopped) {
                Log.d(TAG, "Sleeping");
                try { Thread.sleep(1000); } catch (InterruptedException ignore) {}
            }
            throw new IOException("No AutoDispose 1");
        }).subscribeOn(Schedulers.io())
               .observeOn(AndroidSchedulers.mainThread())
               .to(AutoDispose.with(AndroidLifecycleScopeProvider.from(activity, Lifecycle.Event.ON_STOP)).forObservable())
                .subscribe((it) -> {}, (throwable -> Log.w(TAG, "Caught error  " + throwable)));

这个问题与AutoDispose有关,因为由于Dan Lew提到的问题,我打算继续进行下去。尽管我很好奇这个问题是否也可以通过RxLifeCycle解决。

Here's a full activity for easier execution @ gist

最佳答案

参加聚会有点晚,但最终在https://github.com/uber/AutoDispose/issues/164#issuecomment-393727626中得到了答复

行为良好的源将在发出事件之前检查isDisposed()。就睡觉而言,这确实是尽力而为的事情。

08-26 00:39