Есть ли аналог для Rx Java Тема в Kotlin Сопрограммы? - PullRequest
2 голосов
/ 05 февраля 2020

В 2020 году многие android разработчики говорят о Kotlin сопрограммах. Я пытаюсь понять это и как сопрограммы могут помочь мне в моем проекте.

Итак, мой вопрос: есть ли аналог в сопрограммах для Rx Java Предметы? (Как минимум для PublishSubject).

Что я хочу - я использую PublishSubject для отправки событий с ViewModel на View. Я подписываюсь на eventsSubject по методу onStart() и располагаю по методу onStop().

Итак, минимальные требования для Kotlin аналога сопрограмм:

  • Простое тестирование (я использую TestSubscriber и это здорово)
  • Я хочу отправлять события без буферизации
  • Легко подписаться / отписаться

Вот пример моего варианта использования:

ViewModel:

abstract class AbsStateViewModel<State, Event> : AbsViewModel() {
    private val stateSubject = BehaviorSubject.create<State>()
    private val eventSubject = PublishSubject.create<Event>()

    protected val requireState: State
        get() = stateSubject.value!!

    fun getStateObservable(): Observable<State> = stateSubject

    fun getEventObservable(): Observable<Event> = eventSubject

    protected fun sendEvent(event: Event) {
        eventSubject.onNext(event)
    }

    protected fun setState(state: State) {
        stateSubject.onNext(state)
    }
}

И использования:

viewModel.getEventObservable() // called on onAttach()
            .subscribe(
                    this::handleEvent,
                    this::defaultHandleException
            )
            .disposeOnDetach() // my extensions 

1 Ответ

3 голосов
/ 05 февраля 2020

да в сопрограммах есть аналог rx предметов, каналы. Если вы хотите воспроизвести поведение PublishSubject, вы можете использовать BroadcastChannel, а если вы хотите воспроизвести поведение BehaviorSubject, вы можете использовать ConflatedBroadcastChannel.

...