简谈RxBus

新的应用中用到了RxBus,这里简单叙述一下.

1.添加依赖

// RxJava 2

implementation'io.reactivex.rxjava2:rxjava:2.1.0'

implementation'io.reactivex.rxjava2:rxandroid:2.0.1'

2.写单例RxBusUtil

这个util为什么要是单例的想必想用RxBus的自然一想就知道 ,单例模式就不赘述了,这里主要说明一下里面的方法

这里面最主要的是维护了一个map

private  ConcurrentHashMap>  subjectMapper = new  ConcurrentHashMap<>();//这里的subject是rxjava2里的

首先是注册方法

public Observable register(@NonNull Object tag) {

      List subjects = subjectMapper.get(tag);//这里建议用对应类的名字作为tag,方便管理,乱用的话也可以但是很容易混乱

      if(subjects ==null) {//如果这个类目还没有对应接收的集合就新建一个

            subjects = newArrayList<>();

            subjectMapper.put(tag,subjects);

      }

      Subject subject = PublishSubject.create();//注册的都要建一个接收通知的对象

      subjects.add(subject);//然后添加到对应tag的序列中

      return  subject;

}

然后是发送通知的方法

private void post(@NonNull Object tag,@NonNull Object content) {//要发送给哪个tag,内容

      List subjects =subjectMapper.get(tag);//根据tag取出对应接收者集合

      if(!subjects.isEmpty()) {

             for(Subject subject : subjects) {//循环发送

                  subject.onNext(content);

            }

      }

}

发送时

RxBus.getInstance().post(TAG, bean);//tag就是要接收的地方当时注册的tag,因为是Object类型,所以后面的内容可以是bean类,boolean,String等,在接收的地方也会根据不同类型而接收

最后是反注册方法

public void unregister(@NonNullObject tag,@NonNullObservable observable) {

      List subjects = subjectMapper.get(tag);

      if(subjects != null) {

            subjects.remove(observable);

            if(subjects.isEmpty()) {//如果上面移除的是最后一个,那么就清掉这个对应的tag

                 subjectMapper.remove(tag);

             }

      }

}

3.接收的部分

注册后会返回的一个Observable对象

Observable  observable = RxBus.getInstance().register(TAG);//泛型自己定,这里用Boolean示范

observable.subscribe(newConsumer() {

      @Override

       public voidaccept(Boolean boolean) throws Exception {

            if(boolean) {

            //接收到消息要做的事

            }

      }

});

希望读的人有所收获!!!

你可能感兴趣的:(简谈RxBus)