【发布时间】:2017-02-11 15:44:56
【问题描述】:
我是 rxJava/Android 的新手,很惊讶我的 onError lambda 有时会在主线程上调用,有时不会,尽管我使用 .observeOn(AndroidSchedulers.mainThread())
示例 1:onError 在主线程
这按预期工作:onError 在主线程上被调用
Observable.error(new RuntimeException("RTE"))
.subscribeOn(Schedulers.newThread())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(s -> {
Log.e(TAG, "onNext("+s+")-thread: " + Thread.currentThread().getName());
},
throwable -> {
Log.e(TAG, "onError()-thread: " + Thread.currentThread().getName());
});
日志输出:
onError()-thread: main
示例 2:onError 不是在主线程上
Observable.create(new Observable.OnSubscribe<String>() {
@Override
public void call(Subscriber<? super String> subscriber) {
subscriber.onNext("one and only");
}
})
.subscribeOn(Schedulers.newThread())
.observeOn(AndroidSchedulers.mainThread())
.timeout(1, TimeUnit.SECONDS)
.subscribe(s -> {
Log.e(TAG, "onNext("+s+")-thread: " + Thread.currentThread().getName());
},
throwable -> {
Log.e(TAG, "onError()-thread: " + Thread.currentThread().getName());
});
输出是这样的:
onNext(one and only)-thread: main
onError()-thread: RxComputationScheduler-4
我认为调用observeOn(AndroidSchedulers.mainThread())后,所有的发射都应该在主线程上完成。
所以我有这些问题:
- 我找不到任何说明在什么情况下
onError在哪个线程中被调用的文档。有人知道链接吗? - 我当然想在 GUI 中显示一些错误指示:那么如何强制
onError在主线程中始终被调用?
【问题讨论】:
标签: error-handling rx-java rx-android