RxJava- Является ли cache() тем же, что и replay()?
Мне было интересно, существует ли оператор cache()
, который может кэшировать х количество выбросов, но также и истекает через указанный промежуток времени (например, 1 минута). Я искал что-то вроде...
Observable<ImmutableList<MyType>> cachedList = otherObservable
.cache(1, 1, TimeUnit.MINUTES);
Это будет кэшировать один элемент, но истечет и очистит кеш через минуту.
Я провел некоторое исследование и нашел оператор replay. Казалось, что это выполнит эту потребность, но у меня есть некоторые вопросы. Почему он горячий и нуждается в подключении? Означает ли это, что это отличается от оператора cache()
? Я знаю, что cache()
имитирует тему, но она не требует подключения.
Ответы
Ответ 1
cache
и replay
предназначены для разных вариантов использования. Кэш - это автосоединение replay-all, которое обычно используется для долгосрочных повторов. Повтор может иметь более параметризацию и может выполнять ограниченный повтор времени/размера, но требует, чтобы разработчик указывал, когда начать. Оператор autoConnect()
позволяет вам превратить такие экземпляры ConnectableObservable
в обычный Observable
, который подключается к источнику, как только абонент подписывается на них. Таким образом, вы можете иметь ограниченный и автоматически подключаемый проигрыватель (требуется RxJava 1.0.14 +):
source.replay(1, TimeUnit.SECONDS).autoConnect().subscribe(...);