StickyEvents в Android Observables?

Что эквивалентно getStickyEvent() из EventBus в RxJava.

Я хотел бы подписаться на наблюдаемые с «экранов», которые не находятся на переднем плане/не активны, но в любой момент могут появиться.

Если события происходят постоянно, я хочу, чтобы эти «экраны» получали их в следующий раз, когда они активны/на переднем плане.

Редактировать:

Похоже, у меня должен быть replaySubject, а затем, когда «Экран» выходит на передний план, подписываться на него.....?

  BehaviorSubject – emits the last emitted item when subscribed to,
  then continues to emit items from the source observable

person sirvon    schedule 24.09.2014    source источник
comment
Я буду ссылаться на это для всех остальных, потому что это помогло мне.... stackoverflow.com/questions/25457737/   -  person sirvon    schedule 25.09.2014


Ответы (1)


Вы уже сами дали ответ, но просто для подтверждения: да, вы бы использовали либо 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