RxJava替代EventBus:RxBus
由于最近工程中依賴于RxAndroid與RxJava,因此以RxJava模式實現EventBus相同的API,移除重復功能的依賴,達到精簡工程的目的。
第一步:構造單例
- 在EventBus中
EventBus.getDefault();
- 構造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; }
- 在RxBus中
RxBus.getDefault();
第二步:事件注解
- 在EventBus中
@Subscribe public void onMessageEvent(MessageEvent event) {/* Do something */};
-
構造RxBus相同的API
public class RxBus { //省略第一步... @Target(ElementType.METHOD) @Retention(RetentionPolicy.RUNTIME) public @interface Subscribe {} }
- 在RxBus中
@RxBus.Subscribe public void onMessageEvent(MessageEvent event) {/* Do something */};
第三步:訂閱事件
- 在EventBus中
@Override public void onStart() { super.onStart(); EventBus.getDefault().register(this); }
-
構造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!"); } //省略第二步... }
- 在RxBus中
@Override public void onStart() { super.onStart(); RxBus.getDefault().register(this); }
取消訂閱
- 在EventBus中
@Override public void onStop() { super.onStop(); EventBus.getDefault().unregister(this); }
-
構造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); } //省略第二步... }
- 在RxBus中
@Override public void onStop() { super.onStop(); RxBus.getDefault().unregister(this); }
發送事件
- 在EventBus中
EventBus.getDefault().post(new MessageEvent());
-
構造RxBus相同的API
public class RxBus { //省略第一步... //省略第三步... //省略第四步... public void post (Object event) { bus.onNext(event); } //省略第二步... }
- 在RxBus中
RxBus.getDefault().post(new MessageEvent());
關于ThreadMode
在訂閱時根據需要使用RxJava的Schedulers即可。
來自:http://www.jianshu.com/p/4eb68b206fe0
本文由用戶 ghfn8755 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!