RxJava作为事件总线?

Jim*_*mmy 11 android event-bus android-fragments rx-java

我开始学习RxJava,到目前为止我喜欢它.我有一个片段与按钮单击时的活动进行通信(用新片段替换当前片段).谷歌建议片段的接口与活动进行通信,但是它太冗长了,我试图使用普遍适用的广播接收器,但它有缺点.

因为我正在学习RxJava,我想知道从片段到活动(或片段到片段)的沟通是否是一个很好的选择?如果是这样,那么使用RxJava进行此类通信的最佳方式是什么?我需要做事件总线像这样的一个,如果是那样的话,我应该让总线的一个实例,并在全球范围使用(与主题)?

Dio*_*lor 10

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

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

}
Run Code Online (Sandbox Code Playgroud)

在您的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.
        });
Run Code Online (Sandbox Code Playgroud)

在你片段发生事件时传递事件:

UsernameModel.instanceOf().setString("Nick");
Run Code Online (Sandbox Code Playgroud)

然后你的活动会做点什么.

提示1:使用您喜欢的任何对象类型更改String.

提示2:如果你有依赖注入,它也很有用.


更新: 我写了一篇更长篇文章