这个 RxBus 稳如老狗

logo

rb
License

Download

Gradle:java

implementation "com.blankj:rxbus:1.1"
复制代码

How to use

非粘性事件

  1. 注册事件
public class YourActivity extends Activity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        // 注册 String 类型事件
        RxBus.getDefault().subscribe(this, new RxBus.Callback<String>() {
            @Override
            public void onEvent(String s) {
                Log.e("eventTag", s);
            }
        });

        // 注册带 tag 为 "my tag" 的 String 类型事件
        RxBus.getDefault().subscribe(this, "my tag", new RxBus.Callback<String>() {
            @Override
            public void onEvent(String s) {
                Log.e("eventTag", s);
            }
        });
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        // 注销
        RxBus.getDefault().unregister(this);
    }
}
复制代码
  1. 发送事件
// 发送 String 类型事件
RxBus.getDefault().post("without tag");

// 发送带 tag 为 "my tag" 的 String 类型事件
RxBus.getDefault().post("with tag", "my tag");
复制代码

粘性事件(也就是先发送事件,在以后注册的时候便会收到以前发送的事件)

  1. 发送事件
// 发送 String 类型的粘性事件
RxBus.getDefault().postSticky("without tag");

// 发送带 tag 为 "my tag" 的 String 类型的粘性事件
RxBus.getDefault().postSticky("with tag", "my tag");
复制代码
  1. 注册事件
public class YourActivity extends Activity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        // 注册 String 类型事件
        RxBus.getDefault().subscribeSticky(this, new RxBus.Callback<String>() {
            @Override
            public void onEvent(String s) {
                Log.e("eventTag", s);
            }
        });

        // 注册带 tag 为 "my tag" 的 String 类型事件
        RxBus.getDefault().subscribeSticky(this, "my tag", new RxBus.Callback<String>() {
            @Override
            public void onEvent(String s) {
                Log.e("eventTag", s);
            }
        });
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        // 注销
        RxBus.getDefault().unregister(this);
    }
}
复制代码

Nice wrap

若是用到事件总线的地方比较多,那么能够把事件总线的使用放到一个 Manager 中使用,好比我 Demo 中作的封装以下所示:git

public class RxBusManager {

    private static final String MY_TAG = "MY_TAG";

    public static void subscribeRxBusManagerActivity(final RxBusManagerActivity activity){
        RxBus.getDefault().subscribe(activity, new RxBus.Callback<String>() {
            @Override
            public void onEvent(String s) {
                activity.updateText("without " + s);
            }
        });

        RxBus.getDefault().subscribe(activity, MY_TAG, new RxBus.Callback<String>() {
            @Override
            public void onEvent(String s) {
                activity.updateText("with " + s);
            }
        });
    }

    public static void postToRxBusManagerActivity(final String event) {
        RxBus.getDefault().post(event);
    }

    public static void postWithMyTagToRxBusManagerActivity(final String event) {
        RxBus.getDefault().post(event, MY_TAG);
    }

    public static void postStickyToRxBusManagerActivity(final String event) {
        RxBus.getDefault().postSticky(event);
    }

    public static void postStickyWithMyTagToRxBusManagerActivity(final String event) {
        RxBus.getDefault().postSticky(event, MY_TAG);
    }

    public static void unregisterRxBusManagerActivity(final RxBusManagerActivity activity) {
        RxBus.getDefault().unregister(activity);
    }
}
复制代码

能够看出这是在 RxBusManagerActivity 中要使用 RxBus 的相关代码,这样能够更方便地管理应用中全部的事件总线,而不至于发了个事件都不清楚接收方在哪的尴尬。github

How it comes

网上现有 RxBus 存有的问题:ide

  1. 使用的 RxBus 大多停留在 RxJava1 版本
  2. RxBus 实现的粘性事件不少都是有问题的
  3. 若是事件抛了异常,以后便再也没法接收到的问题
  4. 同类型事件需本身再次封装 Bean 进行区别。

介于以上问题,我仍是亲自封装一个简洁的供你们使用,库已经依赖了 RxAndroid 和 RxJava,因此导入了该库的就不须要再额外导入那两库了。svg

固然,若是通讯频率比较高追求效率的话仍是推荐使用 EventBuspost

Principle

  1. 利用 FlowableProcessor 既能够做为观察者又能够做为被观察者来实现事件总线
  2. 粘性事件原理就是发送的时候把事件存到一个 hash 表中,在注册的时候查询下 hash 表中是否存在符合的事件,有的话就消费掉便可
  3. 替换原有 LambdaSubscriber 来让抛了异常以后能够继续接收到后续事件
  4. 封装了 TagMessage 来区分不一样类别的 tag
  5. 动态识别范型对象来省去传入 Type 类型

还有一些细节就本身看源码去了解吧,总共有用的代码不超过 300 行哈。this

Change log

若是正好帮到了你,那可真是巧了哈,欢迎来个人 狗窝 坐坐。spa

相关文章
相关标签/搜索