我有以下示例:
private var dis: Disposable? = null
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_login)
val btn = findViewById<Button>(R.id.btn)
val btn2 = findViewById<Button>(R.id.btn2)
btn.setOnClickListener {
dis = Single.fromCallable {
Thread.sleep(1000)
15
}
.subscribeOn(Schedulers.io())
//.observeOn(AndroidSchedulers.mainThread())
.subscribe({ v ->
log("Success: $v")
}, { e ->
log("Error: $e")
})
}
btn2.setOnClickListener {
dis?.dispose()
}
}
fun log(msg: String) {
Log.d("TAGG", msg + " on " + Thread.currentThread().name);
}
当“ .observeOn(..)”行被注释并且我:
然后将调用观察者的onError代码块。
当“ .observeOn(..)”行未注释且我:
然后将不会调用观察者的onError代码块。
我就是无法理解这种行为。以我的理解,这行代码不应影响onError是否会被调用的逻辑。
为什么会这样?这是有记录的行为吗?请给我一些解释或重定向。
谢谢!
答案 0 :(得分:0)
通过使用单元测试,我不会重现您的问题。不论是否带有watchOn,我都会观察到抛出给RxJavaPlugins的UndeliverableException并调用了doOnDispose。
您看到什么?
@Test
public void testObserveOnEffect() throws Exception {
Disposable dis = Single.fromCallable(() -> {
Thread.sleep(1000);
return 15;
})
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.doOnDispose(() -> logThread("dispose"))
.subscribe(v -> logThread(v), e -> logThread(e));
Single.timer(50, TimeUnit.MILLISECONDS).subscribe(o -> dis.dispose());
Thread.sleep(2000);
}
答案 1 :(得分:0)
如果您有observeOn
行并且已处置了一次性设备,则RxJava将在尝试将结果传递给订户之前中断流程。