在Android项目中使用RxJava作为事件总线 - 从总线中移除事件

4
我之前使用过 EventBus,它很容易使用和理解。但这一次,我想尝试使用 RxJava 实现类似的事件总线通信。然而,如何从 RxJava 中移除事件并不是很清楚,更确切地说,应该如何设计以实现与 EventBus 在调用 `removeStickyEvent` 时相似的行为?
在 RxJava 中,我可以使用 BehaviorSubject,在订阅此 Observable 时回复最后一个事件。但当这个事件被处理后,我应该怎么做呢?如果我不希望再次重播这个事件,该怎么办?
例如,一个 Fragment 触发了一个事件然后结束了。另一个 Fragment 监听这个事件并处理它。然后,如果此应用程序从不同的情况下再次触发“另一个”活动,则会再次订阅相同的 BehaviorSubject 并处理那个旧事件,这并不是我想要实现的。
我参考了这个项目:https://github.com/marwinxxii/AndroidRxSamples/blob/master/app/src/main/java/com/github/marwinxxii/rxsamples/EventBusSampleActivity.java

抱歉没有给出具体答案,但是...对于你来说,学习RxJava的思想、惯用法和模式可能会更容易,而不是试图重新实现一个在RxJava中可能毫无意义的不同模式。 - Marcin Koziński
1个回答

6
只要您不打算允许您的“事件”为“null”,我认为这可以很容易地实现。就像您所说的那样,您可以使用“BehaviorSubject”来传播“粘性”事件,并且当您想从“总线”中删除“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);
    }
}

那是一个有趣的概念。谢谢。 - Sergei Ledvanov
我现在在思考...如果我使用 BehaviorSubject 并且我的应用程序向不同的服务发布了两个网络调用,然后导航到另一个活动,那么如果该活动将监听这两个事件,它只会收到一个未处理的事件,而不是两个。据我所知,这并不好。有没有什么办法可以解决这个问题? - Sergei Ledvanov
1
请使用 https://github.com/apptik/rxHub 来处理各种情况,以便更好地管理您的编程项目。 - kalin

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接