2016-11-28 6 views
1

У меня есть класс, который обрабатывает изображение, которое может быть медленным процессом. Когда работа выполнена, класс содержит некоторые функции об изображении, такие как доминирующий цвет.Одно асинхронное событие со многими подписчиками в RxJava2

У меня есть много других фрагментов кода, которые хотят знать доминирующий цвет, и когда они запрашивают его, он может быть или не быть готовым.

Мне еще предстоит найти простой способ реализовать это с помощью RxJava2. Кто-нибудь может мне помочь?

Подводя итог, было бы неплохо, если бы я мог бы создать метод, который:

  1. позволяет нескольким абонентам звонить/подписаться.
  2. Когда обработка завершена, подписчики получают результат.
  3. Абоненты автоматически неподписались, чтобы избежать утечек памяти. Второго события не будет, и нет оснований для подписки.
  4. Подписчики, которые подписываются/вызывают метод в более поздней точке, просто получают кешированное значение.

У ReplaySubject, похоже, есть некоторые свойства, которые я ищу, но я не уверен, как правильно его реализовать.

ответ

0

'1. Позволяет нескольким подписчикам звонить/подписываться.
'4. Подписчики, которые подписываются/вызывают метод в более поздней точке, просто получают кешированное значение.

Использовать replay(1) в сочетании с autoConnect(). Это приведет к наблюдению, которое разделяет одну подписку на источник и повторяет последнее значение, испускаемое источником. autoConnect() гарантирует, что источник подписывается напрямую, когда подписывается первый абонент.

  1. Когда обработка завершена, подписчики получают результат.

Используйте Observable.create() и использовать ObservableEmitter излучать результат.

  1. Абоненты автоматически неподписались, чтобы избежать утечек памяти. Второго события не будет, и нет оснований для подписки.

Преобразовать Observable к Single.


Что-то вдоль линий должно работать:

Observable.create(new ObservableOnSubscribe<String>() { 
    @Override 
    public void subscribe(final ObservableEmitter<String> e) throws Exception { 
    Thread.sleep(5000); 
    e.onNext("Test"); 
    e.onComplete(); 
    } 
}).replay(1).autoConnect() 
    .firstOrError(); 

Обратите внимание, что вы должны сохранить ссылку на этот Observable (результат firstOrError()) и использовать этот экземпляр с абонентами.

+0

спасибо.Он отлично работал. –