Разница между 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, который может быть воспроизведен.