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(...);