Разница между Observable.defer и Observable.create в java rx
Может ли кто-нибудь объяснить мне разницу между методами defer
и create
в Observable
? Я не понял, когда следует использовать defer
и когда следует использовать create
..
ЛИТЕРАТУРЫ:
Отложить: http://reactivex.io/documentation/operators/defer.html
Создать: http://reactivex.io/documentation/operators/create.html
Спасибо
Ответы
Ответ 1
create (...) фактически создает Observable немедленно.
public final static <T> Observable<T> create(OnSubscribe<T> f) {
return new Observable<T>(hook.onCreate(f));
}
defer (...) принимает функцию Factory, которая возвращает Observable (Subject и т.д.), обертывает ее с помощью OnSubscribeDefer и создает Observable только тогда, когда подписчик подписывается, новый Observable для каждого абонента.
public final static <T> Observable<T> defer(Func0<Observable<T>> observableFactory) {
return create(new OnSubscribeDefer<T>(observableFactory));
}
Подробнее... здесь
Ответ 2
Итак, различие похоже: defer
хорошо, когда у вас есть что-то, что создает/возвращает наблюдаемое уже, но вы не хотите, чтобы этот процесс выполнялся до подписки.
create
хорош, когда вам нужно вручную обернуть процесс async и создать наблюдаемый. Это создание также отложено до подписки.
Другими словами:
defer
- оператор, который допускает отложенный состав наблюдаемых последовательностей.
create
представляет собой пользовательскую реализацию наблюдаемой последовательности (где создание отложено до подписки).
Итак, если у вас есть ситуация, когда вы можете использовать just
для создания Observable
из некоторых результатов/значений или у вас есть уровень сетевого API, который возвращает Observable
запроса, но вы не хотите это запрос на запуск до подписки. defer
будет хорошо для этих сценариев.
Если у вас есть сетевой уровень API, который не возвращает Observable
для запроса, но для которого вам нужен интерфейс Observable
, вы можете использовать create
. Эта последовательность Observable
все равно не будет создана до подписки. Если вы хотите, чтобы сетевой вызов начинался независимо от подписки, тогда вы использовали бы другой механизм, например, Subject
, который может быть воспроизведен.