Rxjava:obtainOn影响观察者的处置逻辑

时间:2018-06-29 12:55:16

标签: android rx-java rx-java2

我有以下示例:

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(..)”行被注释并且我:

  1. 按btn
  2. 按btn后立即按btn2

然后将调用观察者的onError代码块。

当“ .observeOn(..)”行未注释且我:

  1. 按btn
  2. 按btn后立即按btn2

然后将不会调用观察者的onError代码块。

我就是无法理解这种行为。以我的理解,这行代码不应影响onError是否会被调用的逻辑。

为什么会这样?这是有记录的行为吗?请给我一些解释或重定向。

谢谢!

2 个答案:

答案 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将在尝试将结果传递给订户之前中断流程。

这是问题链接https://github.com/ReactiveX/RxJava/issues/4673