gpt4 book ai didi

error-handling - 如何处理主线程中的RxAndroid错误

转载 作者:行者123 更新时间:2023-12-04 09:58:19 25 4
gpt4 key购买 nike

我是rxJava/Android的新手,虽然我使用onError,但我的.observeOn(AndroidSchedulers.mainThread()) 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 不是

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始终在主线程中调用?
  • 最佳答案

    我刚刚发现,我只需要更改调用顺序即可。当我在observeOn之后调用timeout时,它按预期工作:

    .timeout(1, TimeUnit.SECONDS)
    .observeOn(AndroidSchedulers.mainThread())

    日志输出
    onNext(one and only)-thread: main
    onError()-thread: main

    原因是, observeOn仅会影响调用下方的所有内容,并且仅在其他运算符(operator)再次更改线程之前才起作用。在上面的示例中, timeout()将更改为计算线程。

    请注意, subscribeOn的工作方式有所不同。您在链中的哪个位置都没关系。
    您只能调用一次(多次调用时,它会赢得第一个调用:请参阅此 Blog中的“Multiple subscriptionOn”)

    这是一个不错的博客文章,其中包含更多详细信息: RxJava- Understanding observeOn() and subscribeOn()

    关于error-handling - 如何处理主线程中的RxAndroid错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39835978/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com