RxJava 作为事件总线?

2024-04-09

我开始学习 RxJava,到目前为止我很喜欢它。我有一个片段与单击按钮时的活动进行通信(用新片段替换当前片段)。谷歌推荐界面 http://developer.android.com/training/basics/fragments/communicating.html为了让片段与活动进行通信,但它太冗长了,我尝试使用广播接收器,它通常可以工作,但它有缺点。

由于我正在学习 RxJava,我想知道从片段到活动(或片段到片段)通信是否是一个不错的选择?如果是这样,使用 RxJava 进行此类通信的最佳方法是什么?我需要像这样制作事件总线吗one http://nerds.weddingpartyapp.com/tech/2014/12/24/implementing-an-event-bus-with-rxjava-rxbus/如果是这种情况,我应该创建一个总线实例并在全球范围内使用它(带有主题)吗?


是的,当你学会如何做之后,这真是太神奇了。考虑以下单例类:

public class UsernameModel {

    private static UsernameModel instance;

    private PublishSubject<String> subject = PublishSubject.create();

    public static UsernameModel instanceOf() {
        if (instance == null) {
            instance = new UsernameModel();
        }
        return instance;
    }

    /**
     * Pass a String down to event listeners.
     */
    public void setString(String string) {
        subject.onNext(string);
    }

    /**
     * Subscribe to this Observable. On event, do something e.g. replace a fragment
     */
    public Observable<String> getStringObservable() {
        return subject;
    }

}

在您的 Activity 中准备好接收事件(例如,将其放在 onCreate 中):

UsernameModel usernameModel = UsernameModel.instanceOf();

//be sure to unsubscribe somewhere when activity is "dying" e.g. onDestroy
subscription = usernameModel.getStringObservable()
        .subscribe(s -> {
            // Do on new string event e.g. replace fragment here
        }, throwable -> {
            // Normally no error will happen here based on this example.
        });

在您的片段中,当事件发生时传递该事件:

UsernameModel.instanceOf().setString("Nick");

然后你的活动就会做一些事情。

提示 1:将字符串更改为您喜欢的任何对象类型。

提示 2:如果您有依赖注入,它也很有效。


Update:我写了一篇比较长的article https://lorentzos.com/rxjava-as-event-bus-the-right-way-10a36bdd49ba

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

RxJava 作为事件总线? 的相关文章

随机推荐