提问者:小点点

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


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

在RxJava中,即使我订阅了这个可观察对象,我也可以使用行为主体最后回复,但是当这个事件被处理时我该怎么办?如果我不想再次重放这个事件怎么办?

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

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


共1个答案

匿名用户

只要您不打算允许您的事件null,我认为这可以很容易地实现。

正如你所说的,你可以使用行为主体来传播粘性事件,当你想从总线中移除StickyEvent时,你可以发出一个null对象(来“刷新”主体)。

类似这样的东西(从我的头顶-未经测试,没有泛型,只是一个简单的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);
    }
}