我使用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()
。就睡觉而言,这确实是尽力而为的事情。