RxJava替代EventBus:RxBus

ghfn8755 8年前發布 | 16K 次閱讀 EventBus RxJava

由于最近工程中依賴于RxAndroid與RxJava,因此以RxJava模式實現EventBus相同的API,移除重復功能的依賴,達到精簡工程的目的。

第一步:構造單例

  1. 在EventBus中
    EventBus.getDefault();
  2. 構造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;    
       }
  3. 在RxBus中
    RxBus.getDefault();

第二步:事件注解

  1. 在EventBus中
    @Subscribe
    public void onMessageEvent(MessageEvent event) {/* Do something */};
  2. 構造RxBus相同的API

    public class RxBus { 
    
       //省略第一步...
    
       @Target(ElementType.METHOD)
       @Retention(RetentionPolicy.RUNTIME)
       public @interface Subscribe {}
    }
  3. 在RxBus中
    @RxBus.Subscribe
    public void onMessageEvent(MessageEvent event) {/* Do something */};

第三步:訂閱事件

  1. 在EventBus中
    @Override
    public void onStart() { 
       super.onStart(); 
       EventBus.getDefault().register(this);
    }
  2. 構造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!");
       }
    
       //省略第二步...
    }
  3. 在RxBus中
    @Override
    public void onStart() { 
       super.onStart(); 
       RxBus.getDefault().register(this);
    }

取消訂閱

  1. 在EventBus中
    @Override
    public void onStop() { 
       super.onStop(); 
       EventBus.getDefault().unregister(this);
    }
  2. 構造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);
       }      
    
       //省略第二步...
    }
  3. 在RxBus中
    @Override
    public void onStop() { 
       super.onStop(); 
       RxBus.getDefault().unregister(this);
    }

發送事件

  1. 在EventBus中
    EventBus.getDefault().post(new MessageEvent());
  2. 構造RxBus相同的API

    public class RxBus { 
    
       //省略第一步...
       //省略第三步...
       //省略第四步...     
    
       public void post (Object event) { 
           bus.onNext(event);
       }
    
       //省略第二步...
    }
  3. 在RxBus中
    RxBus.getDefault().post(new MessageEvent());

關于ThreadMode

在訂閱時根據需要使用RxJava的Schedulers即可。

 

來自:http://www.jianshu.com/p/4eb68b206fe0

 

 本文由用戶 ghfn8755 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!