Рассмотрим сценарий, в котором у нас есть поток, генерирующий строки, и мы хотим сохранить строки в файлах.
Я использую PublishSubject, и это прекрасно работает:
Subject<String> stream = PublishSubject.create();
stream.subscribe(str -> saveFile(str));
mReverseGeocoderStream.onNext("some-string1")
mReverseGeocoderStream.onNext("some-string2")
Однако, это не работает (только some-string2
доставляется)
Subject<String> stream = PublishSubject.create();
mReverseGeocoderStream.onNext("some-string1")
stream.subscribe(str -> saveFile(str));
mReverseGeocoderStream.onNext("some-string2")
Есть ли способ заставить работать второй сценарий?
То есть, можем ли мы изменить PublishSubject
, чтобы удостовериться, что он буферизует события до тех пор, пока подписчик их не использует?
Обратите внимание, что BehaviorSubject
не вариант, потому что повторная подписка вызывает другое сохранение файла. В нем нет понятия «поглощающие события».
Я обнаружил UnicastSubject, который в значительной степени мне нужен, за исключением того, что происходит сбой с IllegalStateException, когда я отписываюсь, а затем повторно подписываюсь с другим подписчиком.
Вариант использования:
Предположим, у нас есть приложение для Android. Это делает сетевой запрос, в конце сетевого запроса он должен показать диалог. Пока выполняется запрос, пользователь создает фоновое приложение. На этом этапе мы отписываем наших наблюдателей, которые прослушивают сигнал для отображения диалога.
Сетевой запрос возвращается и сигнал, показывающий, что диалог запускается в поток. Никто не слушает в этот момент. Пользователь на первом плане приложения. Новый абонент подключается к диспетчеру сетевых запросов (ViewModel). На этом этапе я бы хотел, чтобы «неиспользованный» сигнал доставлялся абоненту.
Примечание: я не могу использовать тему поведения. Если я это сделаю, то каждый раз, когда пользователь фоном и на переднем плане приложения, появится диалоговое окно. Я хочу, чтобы событие было обработано и завершено после отображения диалогового окна.