RxRelay переключается обратно в основной поток после второго вызова на прием - PullRequest
0 голосов
/ 30 октября 2018

Я использую популярную библиотеку под названием RxRelay.

private val refreshPlaylists = ReplayRelay.create<Unit>()

refreshPlaylists
    .map<Unit> { refresh ->
        Log.d("Activity", Thread.currentThread().name)
    }
    .subscribeOn(Schedulers.io())
    .subscribe()

refreshPlaylists.accept(Unit)

relayCheck.setOnClickListener {
    refreshPlaylists.accept(Unit)
}

Выход:

first accept: RxCachedThreadScheduler-2
onClickAccept: main
onClickAcceptSecond: main

Почему это?

1 Ответ

0 голосов
/ 30 октября 2018

OnClickListener вызывается в основном потоке, поэтому refreshPlaylists.accept(Unit) также вызывается в основном потоке.

Оператор subscribeOn() влияет только на подписку. Все, что будет принято потом, не будет относиться к этому. Вместо этого он будет передаваться в том же потоке, что и вызов accept().

Вместо этого используйте observeOn(), чтобы изменить поток, в котором наблюдаются излучаемые значения.

...