Вы уже сами дали ответ, но просто для подтверждения: да, вы бы использовали либо BehaviorSubject, либо ReplaySubject.
После того, как новый подписчик подпишется, они оба отправят этому подписчику все элементы, которые они получат с этого момента. Тем не менее, у каждого есть немного больше, чем это:
- BehaviorSubject всегда будет запускать эту последовательность, немедленно отправляя (один) самый последний элемент, который он получил до подписки подписчика, если таковой был. Если его не было, он выдаст элемент по умолчанию, если он был предоставлен при его создании.
- ReplaySubject всегда будет запускать эту последовательность, немедленно выпуская (некоторые или) все элементы, которые он получил с момента его создания, в том порядке, в котором он их получил. ReplaySubject можно инициализировать, чтобы ограничить количество элементов, которые он хранит в кеше для последующих подписчиков, или ограничить количество времени, в течение которого он будет хранить элементы в кеше. Но (насколько мне известно) вы не можете указать значение по умолчанию при использовании ReplaySubject.
Затем, позвонив
subject.subscribe(new Subscriber<YourEventClass>() {
// implement Subscriber methods here
});
будет более или менее эквивалентно:
eventbus.registerSticky(this);
и наличие this
реализации обратных вызовов для EventBus.
Синхронный против асинхронного
Однако обратите внимание, что подобная подписка по-прежнему делает доставку элементов из субъекта асинхронной (например, register/registerSticky), поскольку в обоих случаях вы передаете только некоторые методы обратного вызова, а не ждете, пока результат будет возвращен.
Я сам не использовал Greenrobot EventBus, но кажется, что getStickyEvent() является синхронным/блокирующим.
Если вы хотите блокировать поведение, вам придется - вместо подписки на него - преобразовать тему в наблюдаемую блокировку (с помощью subject.toBlocking()).
См. здесь для получения дополнительной информации о блокировании наблюдаемых:
https://github.com/ReactiveX/RxJava/wiki/Blocking-Observable-Operators
но в основном вы можете затем преобразовать их в итерируемые, или просто получить последний элемент, или ряд других вещей.
person
david.mihola
schedule
24.09.2014