BehaviorSubject vs PublishSubject

Я пытаюсь окунуться в золотое правило (если есть):

Когда использовать BehaviorSubject?

а также

Когда использовать PublishSubject?

Разница между ними очень ясна

Существует много видов предметов. Для этого специфического требования, PublishSubject работает хорошо, потому что мы хотим продолжить последовательность, с которой она остановилась. Таким образом, предполагая, что события (1,2) были выбраны в (B), после того, как (A) соединяется назад, мы хотим видеть только 4, 5, 6. Если бы мы использовали ReplaySubject, мы увидели бы [1, 2, 3], 4, 5, 6; или если мы использовали BehaviorSubject, мы увидели бы 3, 4, 5, 6 и т.д. (источник: как думать о субъектах в RxJava (часть 1))

Я видел, что Subject используется в двух контекстах (по крайней мере), контексте интерфейса и контексте слушателя.

  • Контекст пользовательского интерфейса (пример MVVM)

Например, здесь используется BehaviorSubject, и он ясно объясняет, почему они используют Subject а не Observable но я изменил BehaviorSubject для PublishSubject но поведение приложения все тот же.

  • Контекст слушателя

Почему они делают поле проекта PublishSubject BehaviorSubject а не PublishSubject?

Ответ 1

Основное различие между PublishSubject и BehaviorSubject заключается в том, что последний запоминает последний испущенный элемент. Из-за этого BehaviorSubject действительно полезен, когда вы хотите испустить states.

Почему они делают поле проекта BehaviorSubject, а не PublishSubject?

Возможно, потому что они хотят иметь возможность извлечь последний отправленный проект с помощью этого метода:

@Override public @NonNull Observable<Project> project() {
  return this.project;
}

Ответ 2

PublishSubject: запускается пустым и только генерирует новые элементы подписчикам. Существует вероятность того, что один или несколько элементов могут быть утеряны между временем создания субъекта и подпиской наблюдателя, поскольку PublishSubject начинает испускать элементы сразу после создание.

BehaviorSubject: ему нужно начальное значение и повтор или последний элемент для новых подписчиков. Поскольку BehaviorSubject всегда испускает последний элемент latest element, вы не можете создать его без указания начального значения по умолчанию. BehaviorSubject полезен для отображения "значений во времени". Например, потоком дней рождения является субъект, а потоком человека будет BehaviorSubject.

Ответ 3

Различие между BehaviourSubject и PublishSubject зависит от того, как долго они хранят данные, которые они захватывают, в частности, PublishSubject только сохраняет данные, доступные во время записи, и обновляет каждую запись, в то время как BehaviourSubject сохраняет последние вставленные данные, поэтому вы можете использовать, например, для подтверждения пароль в форме регистрации и в качестве примера для PublishSubject, выполняя поиск, и он должен постоянно обновлять данные, чтобы дать точные результаты, и не нужно слишком сильно сравнивать вставляемые данные.

В качестве ссылки я оставляю эти две фотографии из http://reactivex.io/documentation/subject.html

PublishSubject

BehaviourSubject