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 bus = new SerializedSubject<>(PublishSubject.create());
      private final ArrayMap> 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() {
                  @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 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 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即可。

你可能感兴趣的:(RxJava替代EventBus:RxBus)