2016-08-05 6 views
0

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

final ConnectableObservable<Notification> errorNotifications = pm 
    .getNotificationObservable() 
    .filter(notification -> notification.getType().isError() && !notification.getLongMessage().isEmpty()) 
    .replay(1); 

errorNotifications.connect(); 

SwingObservable.fromMouseEvents(dialog.getMessagePanel().getMessageLabel()) 
       .map(MouseEvent::getClickCount) 
       .filter(number -> number >= 2) 
       .subscribe(integer -> errorNotifications 
        .take(1) 
        .subscribe(notification -> ErrorDialog.showError(dialog.getFrame(), "Error", notification.getLongMessage()))); 

Я отфильтровывать уведомление наблюдаемого, чтобы показывать только erros и переигрываюсь последней ошибкой, если я подписываюсь из него изнутри моей мыши наблюдаемой.

Теперь, мой вопрос: есть ли какие-либо операторы в RxJava, с помощью которых я могу сделать это более ... аккуратно? Я попытался использовать combineLatest(), но это повлияло на то, что каждый раз при открытии диалогового окна открывается ошибка.

В более абстрактном виде: у меня есть два наблюдаемых, один из них «хозяин»: если наблюдаемый мастер (щелчок по наблюдаемому) испускает элемент, другой наблюдаемый (мои уведомления об ошибках) должен испускать последний элемент.

ответ

2

Использование другой Observable в подписке часто является недостатком дизайна.

В этом response вы можете обратиться к оператору flatMap. Это поможет вам исправить сообщение об ошибке при выделении другого события.

Например, если вы хотите использовать flatMap оператор с кодом, он может быть обновлен следующим образом:

final ConnectableObservable<Notification> errorNotifications = 
                pm.getNotificationObservable() 
                .filter(notification -> notification.getType().isError() && !notification.getLongMessage().isEmpty()) 
                .replay(1); 

errorNotifications.connect(); 

SwingObservable.fromMouseEvents(dialog.getMessagePanel().getMessageLabel()) 
      .map(MouseEvent::getClickCount) 
      .filter(number -> number >= 2) 
      .flatMap(integer -> errorNotifications.take(1)) 
      .subscribe(notification -> ErrorDialog.showError(dialog.getFrame(), "Error", notification.getLongMessage()))); 
+0

flatMap, кажется, работает, но я не уверен, если я понимаю основную технологию: Так ReplaySubject будет выдавать последний элемент на subscript, что означает, что flatMap() также подписывается на результат, наблюдаемый из переданной функции сопоставления ...? – morpheus05

+0

flatMap объединит весь результат из наблюдаемых, что ваш лямбда-возврат. Таким образом, с помощью Replaysubject вы будете уведомлены о последних событиях и последующих событиях. С помощью оператора take вы будете уведомлены каждый раз только о последних событиях. – dwursteisen