如何在主线程中处理 RxAndroid 错误

how to handle RxAndroid errors in the main thread

我是 rxJava/Android 的新手,虽然我使用 .observeOn(AndroidSchedulers.mainThread())

,但我的 onError lambda 有时会在主线程上调用,有时不会,这让我感到惊讶

示例 1onError 在主线程上
这按预期工作: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

示例 2onError 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()) 之后,所有排放都应该在主线程上完成。

所以我有这些问题:

  1. 我找不到任何说明在什么情况下在哪个线程中调用 onError 的文档。有谁知道 link?
  2. 我当然想在 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()