Я пытаюсь извлечь некоторые общие логи c, основанные на RxJava2, в повторно используемые компоненты. Давайте представим, что у меня есть следующий фрагмент кода:
someSingle
.doOnSuccess { // update UI based on side effect }
.subscribeOn(...)
.observeOn(...)
.subscribe(
value -> // update UI based on value
throwable -> // handle error
)
Я хочу обернуть это в повторно используемый компонент, предоставляя метод, который возвращает Flowable событий. Клиенты будут получать события и соответственно обновлять пользовательский интерфейс. Моя цель - не ссылаться на представление внутри повторно используемого компонента. Я хочу, чтобы метод был примерно таким:
fun reusableMethod(...) : Flowable<Event> { ... }
Event
- это запечатанный класс, включающий два подтипа - SideEffectEvent
и ValueEvent
.
Что лучший способ преобразовать поток из первого фрагмента, чтобы я мог получить как побочный эффект, так и значение, которое будет передаваться как текущие значения?
В настоящее время у меня есть следующее решение, но я Я не очень доволен этим, потому что он выглядит немного неуклюжим и сложным:
private val sideEffectEvents = PublishProcessor.create<SideEffectEvent>()
fun reusableMethod(...) =
Flowable.merge(
someSingle.doOnSuccess { sideEffectEvents.onNext(SideEffectEvent()) },
sideEffectEvents
)
.subscribeOn(...)
.observeOn(...)
Я также рассмотрел несколько альтернатив:
- Уведомление клиента за
SideEffectEvent
s использование обратного вызова, который передается на someReusableMethod()
- выглядит очень неестественно и наличие обратного вызова и потока для подписки не является хорошим стилем кода - Используйте один
PublishProcessor
. Опубликуйте побочные эффекты и используйте его, чтобы подписаться на оригинал Single
. Предоставьте метод cleanUp()
в повторно используемом компоненте, чтобы клиент мог распоряжаться потоком, когда он решит.
Я с нетерпением жду предложений и идей.