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 не приходит. В чем проблема?
Скорее всего вам нужно использовать BehaviorSubject вместо PublishSubject. Когда вы вызываете onNext() у PublishSubject он отправит объект User только активным подписчикам. Если второй экземпляр презентера подпишется после того как уже был отправлен User, он получит User только когда вы снова вызовете onNext() в репозитории. BehaviorSubject же всегда отправляет последний элемент подписчикам в момент подписки, т.е. при повторном создании фрагмента, новый презентер получит ранее переданный в BehaviorSubject объект User.
Статья с описанием видов Rx Subject
Сборка персонального компьютера от Artline: умный выбор для современных пользователей