PublishSubject в Presenter

101
27 февраля 2022, 06:10

PublishSubject получаю посредством метода в DbRepository. Сам DbRepository Singleton

public PublishSubject<User> getUser() {
        return userSubject;
    }

Создаю слушатель на PublishSubject в Presenter

public void listenUser(){
        disposableBag.add(this.dbRepository.getUser().subscribe(user -> {
           // Действия
        }));
    }

Вызываю его в Fragment

  @Override
        public void onCreate(@Nullable Bundle savedInstanceState) {
            presenter.listenUser();
            super.onCreate(savedInstanceState);
        }

Уничтожаю его методом

public void unListen(){
    disposableBag.clear();
}

В фрагменте

@Override
    public void onDestroy() {
        presenter.unListen();
        super.onDestroy();
    }

Проблема в том что когда первый раз захожу во фрагмент то инициализируется Presenter и я начинаю слушать PublishSubject, приходит последний user, все окей. Потом когда я нажимаю кнопку назад происходит onDestroy, подписка удаляется. При повторном входе в фрагмент опять же инициализируется Presenter , но listenUser() как будто игнорируется, последний user не приходит. В чем проблема?

Answer 1

Скорее всего вам нужно использовать BehaviorSubject вместо PublishSubject. Когда вы вызываете onNext() у PublishSubject он отправит объект User только активным подписчикам. Если второй экземпляр презентера подпишется после того как уже был отправлен User, он получит User только когда вы снова вызовете onNext() в репозитории. BehaviorSubject же всегда отправляет последний элемент подписчикам в момент подписки, т.е. при повторном создании фрагмента, новый презентер получит ранее переданный в BehaviorSubject объект User.

Статья с описанием видов Rx Subject

READ ALSO
Метод, принимающий значения типа List&lt;&gt;

Метод, принимающий значения типа List<>

Есть класс Book, который содержит поля типа String такие как Название книги, автор, издательство, тип переплета, год издательства, кол-во страниц...

82
Как читать wss:// поток в php без библиотек (streaming api vk)

Как читать wss:// поток в php без библиотек (streaming api vk)

Streaming api vk позволяет получать события со всего вк, и реализовано это через wss:// протоколНасколько я нагуглил, wss:// не поддерживается PHP по умолчанию

92
switch &lt; или &gt; в (int)

switch < или > в (int)

Возможно ли в switch сделать проверку на < ( больше ) или > ( меньше )

171
RestAPI - как реализовать возврат данных?

RestAPI - как реализовать возврат данных?

В общем делаю проект на Laravel с RestApi и vuejsВозврат products делаю с использованием ApiResource в Laravel

76