Intereting Posts
Почему выражения лямбда ведут себя по-разному для классов Kotlin и Java? Kotlin типа безопасный строитель DSLs, безопасность для самой внешней функции Как добавить пользовательские группы просмотра в Anko DSL? Как получить KProperty1 из KProperty0 Android Local VPN Service: не может пересылать пакеты Android предотвращает просмотр от успешных событий Функции делегирования класса Kotlin Возможно ли сделать фон макета активности прозрачным в kotlin android Оператор == не может применяться к «Long» и «Int» в Kotlin gradle не удается скомпилировать классы java с использованием класса kotlin Выполнение программы Java и Kotlin с библиотекой времени исполнения Kotlin в пути к классам Как получить имена параметров через отражение в котлин? Приложение build.gradle.kts Файл Unresolved Reference Erros Как полностью использовать RecyclerView's SortedList Glide onLoadFailed () триггер после загрузки всего изображения после прокрутки вниз, а затем прокрутки вверх

Как создать кеширование / горячую версию 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); } } }