如何在主线程中处理 RxAndroid 错误
how to handle RxAndroid errors in the main thread
我是 rxJava/Android 的新手,虽然我使用 .observeOn(AndroidSchedulers.mainThread())
,但我的 onError
lambda 有时会在主线程上调用,有时不会,这让我感到惊讶
示例 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
NOT 在主线程上
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
的文档。有谁知道 link?
- 我当然想在 GUI 中显示一些错误指示:那么我如何强制
onError
在主线程中始终被调用?
因为 .timeout(1, TimeUnit.SECONDS)
默认在 Schedulers.computation()
上运行。
我刚刚发现我只需要改变调用的顺序。当我在 timeout
之后调用 observeOn
时,它按预期工作:
.timeout(1, TimeUnit.SECONDS)
.observeOn(AndroidSchedulers.mainThread())
日志输出
onNext(one and only)-thread: main
onError()-thread: main
原因是,observeOn
只会影响调用下面的所有内容,并且只会影响其他操作员再次更改线程。在上面的例子中,timeout()
将更改为计算线程。
请注意,subscribeOn
的工作方式不同。在链中的哪个位置调用它并不重要。
您应该只调用一次(当您多次调用它时,第一个调用获胜:请参阅 "Multiple subscribeOn" Blog)
这是一篇不错的博客-post,其中包含更多详细信息:RxJava- Understanding observeOn() and subscribeOn()
我是 rxJava/Android 的新手,虽然我使用 .observeOn(AndroidSchedulers.mainThread())
onError
lambda 有时会在主线程上调用,有时不会,这让我感到惊讶
示例 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
NOT 在主线程上
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
的文档。有谁知道 link? - 我当然想在 GUI 中显示一些错误指示:那么我如何强制
onError
在主线程中始终被调用?
因为 .timeout(1, TimeUnit.SECONDS)
默认在 Schedulers.computation()
上运行。
我刚刚发现我只需要改变调用的顺序。当我在 timeout
之后调用 observeOn
时,它按预期工作:
.timeout(1, TimeUnit.SECONDS)
.observeOn(AndroidSchedulers.mainThread())
日志输出
onNext(one and only)-thread: main
onError()-thread: main
原因是,observeOn
只会影响调用下面的所有内容,并且只会影响其他操作员再次更改线程。在上面的例子中,timeout()
将更改为计算线程。
请注意,subscribeOn
的工作方式不同。在链中的哪个位置调用它并不重要。
您应该只调用一次(当您多次调用它时,第一个调用获胜:请参阅 "Multiple subscribeOn" Blog)
这是一篇不错的博客-post,其中包含更多详细信息:RxJava- Understanding observeOn() and subscribeOn()