代码之家  ›  专栏  ›  技术社区  ›  Sergei Ledvanov

RxJava作为Android项目中的事件总线-从总线中删除事件

  •  4
  • Sergei Ledvanov  · 技术社区  · 9 年前

    我以前使用过EventBus,它很容易使用和理解。然而,这一次,我想尝试使用RxJava进行类似事件总线的通信,但是,如何从RxJava中删除事件,或者更好地说,如何适当地设计它,使其在我调用时具有与EventBus类似的行为,还不是很清楚 removeStickyEvent ?

    在RxJava中,我可以使用BehaviorSubject最后回复,即使我订阅了这个可观察的对象,但当处理这个事件时,我应该怎么做?如果我不想再次重播此事件,该怎么办?

    例如,一个片段触发一个事件,然后完成。另一个片段侦听并处理此事件。然后,如果此应用程序在不同的情况下再次触发“另一个”活动,那么它将再次订阅同一BehaviorSubject,并再次处理该陈旧事件,这不是我想要实现的。

    我把这个项目作为参考 https://github.com/marwinxxii/AndroidRxSamples/blob/master/app/src/main/java/com/github/marwinxxii/rxsamples/EventBusSampleActivity.java

    1 回复  |  直到 9 年前
        1
  •  6
  •   Bartek Lipinski    9 年前

    只要你不打算允许 events 成为 null ,我认为这很容易实现。

    正如你所说,你可以使用 BehaviorSubject 传播 sticky 事件,以及何时需要 removeStickyEvent 来自 bus ,您可以发出 无效的 对象(以“刷新” subject ).

    类似这样的东西(从我的头顶上看-没有测试,没有泛型,只是一个简单的 Object -基于事件的示例):

    public class RxEventBus {
    
        PublishSubject<Object> eventsSubject = PublishSubject.create();
        BehaviorSubject<Object> stickyEventsSubject = BehaviorSubject.create();
    
        public RxEventBus() {
        }
    
        public Observable<Object> asObservable() {
            return eventsSubject;
        }
    
        public Observable<Object> asStickyObservable() {
            return stickyEventsSubject.filter(new Func1<Object, Boolean>() {
                @Override
                public Boolean call(Object o) {
                    return o != null;
                }
            });
        }
    
        public void postEvent(@NonNull Object event) {
            eventsSubject.onNext(event);
        }
    
        public void postStickyEvent(@NonNull Object stickyEvent) {
            stickyEventsSubject.onNext(stickyEvent);
        }
    
        public void removeStickyEvent(){
            stickyEventsSubject.onNext(null);
        }
    }