Intereting Posts
Ошибка экземпляра экземпляра в kotlin: умный приведение к типу невозможно AWS S3 неразрешенный супертип: TransferListener в классе верхнего уровня Kotlin Как создать экземпляр Singleton только один раз в моем приложении и его библиотеках? Не удалось добавить mysql-коннектор в build.gradle для проекта kotlin? Как liveata отправляет данные в действие, если какие-либо изменения Канал выхода из вентилятора / вентилятора в закрытии использовать kotlin для springmvc Не удалось создать экземпляр класса данных класса bean Как уменьшить размер изображения перед загрузкой, чтобы ускорить приложение? Дженерики для RecyclerView.Adapter Android Есть ли способ передать ссылку на функцию между действиями? Как сгруппировать дублированный оператор в .apply в Котлине? Котлинские мутаторы В Kotlin, как мне добавить методы расширения в другой класс, но только видимый в определенном контексте? Проверка метода Спящий режим Anko: внутренняя область применения, сбивающее с толку разрешение собственности

Как создать кеширование / горячую версию rx.Single?

В RxJava v1.0.13 был введен новый тип наблюдаемого: rx.Single . Он отлично подходит для модели запроса-ответа, но не имеет стандартных побочных эффектов, вводящих операторов, таких как doOnNext (). Таким образом, в результате намного сложнее сделать несколько вещей.

Моя идея состояла в том, чтобы заменить doOnNext () несколькими подписками на один и тот же экземпляр Single. Но это может привести к тому, что подстилающая работа будет выполняться несколько раз: один раз за каждую подписку.

Пример rx. Единая реализация:

private class WorkerSubscribe<SomeData>() : Single.OnSubscribe<SomeData> { override fun call(sub: SingleSubscriber<in SomeData>) { try { val result = fetchSomeData() sub.onSuccess(result) } catch(t: Throwable) { sub.onError(t) } } } val single = Single.create<SomeData>(WorkerSubscribe()) 

Применение:

 single.subscribe({}, {}) single.subscribe({}, {}) // Data is fetched for the second time 

Возможно ли создать экземпляр Single, который не будет fetchSomeData () несколько раз, даже когда single.subscribe () вызывается несколько раз, но кеш и возвращает тот же результат?

Solutions Collecting From Web of "Как создать кеширование / горячую версию rx.Single?"

Вам нужен RxJava Subject : BehaviorSubject или AsyncSubject

Мне просто нужно было подобное поведение и нашел какое-то решение.

Вы можете преобразовать Single to Observable apply cache() и затем преобразовать его в Single .

 yourSingle.toObservable().cacheWithInitialCapacity(1).toSingle() 

Я использую cacheWithInitialCapacity(1) а не только cache() в качестве оптимизации – Single никогда не будет излучать больше одного элемента.

Также неплохо обеспечить реализацию Transformer

 public class SingleUtils { public static <T> Single.Transformer<T, T> cached() { return single -> single.toObservable() .cacheWithInitialCapacity(1) .toSingle(); } } 

поэтому вы можете использовать кеширование, где хотите, вызывая

 yourSingle.compose(SingleUtils.cached()) 

Изменить: начиная с rxJava 1.2.2 он был добавлен ( https://github.com/ReactiveX/RxJava/releases/tag/v1.2.2 )

Реализовано именно так ( https://github.com/ReactiveX/RxJava/pull/4757 )

Проверьте операцию cache() . Он должен кэшировать выбросы от Observable и воспроизводить их последующим Subscriber .

Вы можете создать BehaviorSubject / ReplaySubject / AsyncSubject – и затем вызвать onSingle на нем.

Я сделал обходной путь, что меня это не устраивает, но он работает:

 public class Network { private Object data; private Single<Object> dataSingle; public Single<Object> getData { if (data == null) { if (dataSingle == null) { dataSingle = Single.create(...) .doOnSuccess( data -> this.data = data;) .sibscribeOn(..); } return dataSingle; } else { return Single.just(data); } } }