TmT*_*ron 7 error-handling rx-java rx-android
我是rxJava/Android的新手并且惊讶于我的onErrorlambda有时被称为主线程,有时候不会,尽管我使用.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());
});
Run Code Online (Sandbox Code Playgroud)
日志输出:
onError()-thread: main
Run Code Online (Sandbox Code Playgroud)
示例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());
});
Run Code Online (Sandbox Code Playgroud)
输出是这样的:
onNext(one and only)-thread: main
onError()-thread: RxComputationScheduler-4
Run Code Online (Sandbox Code Playgroud)
我认为在调用observeOn(AndroidSchedulers.mainThread())之后,应该在主线程上完成所有排放.
所以我有这些问题:
onError调用哪个线程的文档.有谁知道链接?onError在主线程中始终调用?TmT*_*ron 12
我刚刚发现我只需要改变通话顺序.当我打电话observeOn后timeout它按预期工作:
.timeout(1, TimeUnit.SECONDS)
.observeOn(AndroidSchedulers.mainThread())
Run Code Online (Sandbox Code Playgroud)
日志输出
onNext(one and only)-thread: main
onError()-thread: main
Run Code Online (Sandbox Code Playgroud)
原因是,这observeOn只会影响调用之下的所有内容,并且只有在其他操作符再次更改线程之后才会影响.在上面的示例中,timeout()将更改为计算线程.
请注意,其subscribeOn工作方式不同.你称之为链条的位置并不重要.
你应该只调用一次(当你第一次调用wins多次调用它时:参见本博客中的"Multiple subscribeOn")
这是一个很好的博客文章,其中包含更多详细信息:RxJava-了解observeOn()和subscribeOn()