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

Posted

技术标签:

【中文标题】RxJava 作为 Android 项目中的事件总线 - 从总线中删除事件【英文标题】:RxJava as event bus in Android project - remove event from the bus 【发布时间】:2016-06-06 06:43:00 【问题描述】:

我之前用过EventBus,好用,好理解。然而,这一次,我想尝试使用 RxJava 进行类似事件总线的通信,但是目前还不清楚如何从 RxJava 中删除事件,或者更确切地说,应该如何正确设计它以具有与 EventBus 类似的行为当我打电话给removeStickyEvent

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

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

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

【问题讨论】:

对不起,我没有回答,但是.. 学习 RxJava 背后的想法以及它的惯用用法和模式可能更容易,而不是尝试重新实现一个不同的模式在 RxJava 中可能没有意义。 【参考方案1】:

只要您不打算让您的events 成为null,我认为这很容易实现。

正如你所说,你可以使用BehaviorSubject 来传播sticky 事件,当你想从bus 传播removeStickyEvent 时,你可以只发出一个null 对象(以“刷新” subject)。

类似这样的东西(从我的脑海中浮出水面 - 未经测试,没有泛型,只是一个简单的基于 Object-event 的示例):

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);
    

【讨论】:

这是一个有趣的概念。谢谢。 我现在在想....如果我使用BehaviorSubject 并且我的应用程序向不同的服务发布了两个网络调用,然后导航到另一个活动,那么如果另一个活动将监听这两个事件,它只会得到一个未处理的事件,而不是两个。这不是很好的AFAIK。有什么办法可以解决吗? 使用 2 个主题 :) 甚至更好的github.com/apptik/rxHub 来处理各种案件

以上是关于RxJava 作为 Android 项目中的事件总线 - 从总线中删除事件的主要内容,如果未能解决你的问题,请参考以下文章

原创专栏RxJava源代码剖析

RxJava

RxJava入门系列四,Android中的响应式编程

Android学习之RxView

android学习笔记--RxJava

Android学习之RxView