RxJava替代EventBus:RxBus

简要说明

关于RxJava:https://github.com/ReactiveX/RxJava
关于EventBus:https://github.com/greenrobot/EventBus
由于最近工程中依赖于RxAndroid与RxJava,因此以RxJava模式实现EventBus相同的API,移除重复功能的依赖,达到精简工程的目的。

第一步:构造单例
  1. 在EventBus中
EventBus.getDefault();
  1. 构造RxBus相同的API
public class RxBus {    
      private static volatile RxBus instance;    
      private RxBus() {}    
      public static RxBus getDefault() {        
         if (instance == null) {           
             synchronized (RxBus.class) {                
                 if (instance == null) {                    
                     instance = new RxBus();                
                 }            
              }        
         }        
         return instance;    
      }
  1. 在RxBus中
RxBus.getDefault();
第二步:事件注解
  1. 在EventBus中
@Subscribe
public void onMessageEvent(MessageEvent event) {/* Do something */};
  1. 构造RxBus相同的API
public class RxBus { 

      //省略第一步...

      @Target(ElementType.METHOD)
      @Retention(RetentionPolicy.RUNTIME)
      public @interface Subscribe {}
}
  1. 在RxBus中
@RxBus.Subscribe
public void onMessageEvent(MessageEvent event) {/* Do something */};
第三步:订阅事件
  1. 在EventBus中
@Override
public void onStart() { 
      super.onStart(); 
      EventBus.getDefault().register(this);
}
  1. 构造RxBus相同的API
public class RxBus { 

      //省略第一步...

      private final Subject<Object, Object> bus = new SerializedSubject<>(PublishSubject.create());
      private final ArrayMap<String, List<Subscription>> subscriptionArray = new ArrayMap<>();
      
      public void register(final Object observable) {    
          boolean isRegisterSuccess = false;    
          final String subscriptionKey = observable.getClass().getName();
          //反射获取方法列表  
          Method[] methods = observable.getClass().getMethods();    
          for (Method method : methods) {    
              //如果方法不存在Subscribe注解则不做处理
              if (!method.isAnnotationPresent(Subscribe.class)) continue;        
              final Method subscriptionMethod = method;
              //获取方法参数类型,即:MessageEvent.class
              Class<?> key = method.getParameterTypes()[0];
              //订阅MessageEvent.class类型实例,ofType作用已filter相近
              Subscription subscription = bus.ofType(key).subscribe(new Action1<Object>() {
                  @Override            
                  public void call(Object value) {
                      try {
                          //反射赋值,即传递事件值
                          subscriptionMethod.setAccessible(true);
                          subscriptionMethod.invoke(observable, value);
                      } catch (IllegalAccessException | InvocationTargetException e) { 
                          throw new RuntimeException(subscriptionKey + " isn't allowed to register!");
                      }
                  }
              });
              //存储订阅实例列表,用于后续解除注册
              List<Subscription> subscriptions;
              if (subscriptionArray.containsKey(subscriptionKey)) {
                 subscriptions = subscriptionArray.get(subscriptionKey);
              } else {
                 subscriptions = new ArrayList<>();
              }
              subscriptions.add(subscription);
              subscriptionArray.put(subscriptionKey, subscriptions); 
              isRegisterSuccess = true;
          }
          //如果注册的类中不存在Subscribe注解方法,则抛出异常提醒
          if (!isRegisterSuccess) 
              throw new RuntimeException(subscriptionKey + " has no any RxBuxSubscribe Event!");
      }

      //省略第二步...
}
  1. 在RxBus中
@Override
public void onStart() { 
      super.onStart(); 
      RxBus.getDefault().register(this);
}
取消订阅
  1. 在EventBus中
@Override
public void onStop() { 
      super.onStop(); 
      EventBus.getDefault().unregister(this);
}
  1. 构造RxBus相同的API
public class RxBus { 

      //省略第一步...
      //省略第三步...

      public void unregister(Object observable) {    
          String subscriptionKey = observable.getClass().getName();
          if (!subscriptionArray.containsKey(subscriptionKey)) return;
          List<Subscription> subscriptions = subscriptionArray.get(subscriptionKey);
          for (Subscription subscription : subscriptions) {
              //如果已订阅,则取消订阅
              if (!subscription.isUnsubscribed()) subscription.unsubscribe();
          }
          subscriptionArray.remove(subscriptionKey);
      }      

      //省略第二步...
}
  1. 在RxBus中
@Override
public void onStop() { 
      super.onStop(); 
      RxBus.getDefault().unregister(this);
}
发送事件
  1. 在EventBus中
EventBus.getDefault().post(new MessageEvent());
  1. 构造RxBus相同的API
public class RxBus { 

      //省略第一步...
      //省略第三步...
      //省略第四步...     
      
      public void post (Object event) { 
          bus.onNext(event);
      }

      //省略第二步...
}
  1. 在RxBus中
RxBus.getDefault().post(new MessageEvent());
关于ThreadMode

在订阅时根据需要使用RxJava的Schedulers即可。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 原文链接:http://blog.csdn.net/u012810020/article/details/7005...
    tinyjoy阅读 3,596评论 1 5
  • 项目到了一定阶段会出现一种甜蜜的负担:业务的不断发展与人员的流动性越来越大,代码维护与测试回归流程越来越繁琐。这个...
    fdacc6a1e764阅读 8,409评论 0 6
  • 我从去年开始使用 RxJava ,到现在一年多了。今年加入了 Flipboard 后,看到 Flipboard 的...
    Jason_andy阅读 10,915评论 7 62
  • 前言我从去年开始使用 RxJava ,到现在一年多了。今年加入了 Flipboard 后,看到 Flipboard...
    占导zqq阅读 12,991评论 6 151
  • 博文出处:EventBus源码解析,欢迎大家关注我的博客,谢谢! 0001B 时近年末,但是也没闲着。最近正好在看...
    俞其荣阅读 5,083评论 1 16