Rxjava: observOn влияет на логику удаления наблюдателя

У меня есть следующий пример:

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);
}

Когда». @test общественности недействительным testObserveOnEffect () кидает Exception { Одноразовые Дис = Single . FromCallable (() -> { Thread . Сон ( 1000 ), возвращение 15 ; }) . SubscribeOn ( Планировщики . Ю ()) . ObserveOn ( AndroidSchedulers . mainThread ()) . doOnDispose (() -> logThread ( «распоряжаться» )) . подписаться ( v -> logThread ( v ), e -> logThread ( e )); Одноместный . таймер ( 50 , TimeUnit . MILLISECONDS ). подписаться ( o -> dis . dispose ()); Тема . сон ( 2000 год ); } (..) ": COMMENTED и I:

  1. пресса btn
  2. нажмите btn2 сразу после нажатия btn

Затем будет вызван блок запроса onRrror наблюдателя.

Когда строка «.observeOn (..)» НЕОБХОДИМА, и я:

  1. пресса btn
  2. нажмите btn2 сразу после нажатия btn

Затем блок invor's onError кода НЕ будет вызываться.

Я просто не понимаю такого поведения. В моем понимании эта строка кода не должна влиять на логику того, будет ли onError вызываться или нет.

Почему это происходит? Это документированное поведение? Пожалуйста, дайте мне некоторые объяснения или переадресации.

Спасибо!

android,rx-java,rx-java2,

0

Ответов: 2


0

Используя единичный тест, я не воспроизвожу вашу проблему. С наблюдением или без него я наблюдаю исключение UndeliverableException, которое вызывается в RxJavaPlugins и вызываемый doOnDispose.

Что ты видишь?

observeOn

0

Если у вас есть observeOnлиния и одноразовая утилита, RxJava прервет поток, прежде чем пытаться доставить результат подписчику.

Вот ссылка на проблему https://github.com/ReactiveX/RxJava/issues/4673

андроид, гй-Java, гй-java2,
Похожие вопросы
Яндекс.Метрика