簡(jiǎn)要說(shuō)明
關(guān)于RxJava:https://github.com/ReactiveX/RxJava
關(guān)于EventBus:https://github.com/greenrobot/EventBus
由于最近工程中依賴(lài)于RxAndroid與RxJava亲轨,因此以RxJava模式實(shí)現(xiàn)EventBus相同的API,移除重復(fù)功能的依賴(lài)鸟顺,達(dá)到精簡(jiǎn)工程的目的惦蚊。
第一步:構(gòu)造單例
- 在EventBus中
EventBus.getDefault();
- 構(gòu)造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 */};
- 構(gòu)造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);
}
- 構(gòu)造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;
//獲取方法參數(shù)類(lèi)型,即:MessageEvent.class
Class<?> key = method.getParameterTypes()[0];
//訂閱MessageEvent.class類(lèi)型實(shí)例讯嫂,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!");
}
}
});
//存儲(chǔ)訂閱實(shí)例列表,用于后續(xù)解除注冊(cè)
List<Subscription> subscriptions;
if (subscriptionArray.containsKey(subscriptionKey)) {
subscriptions = subscriptionArray.get(subscriptionKey);
} else {
subscriptions = new ArrayList<>();
}
subscriptions.add(subscription);
subscriptionArray.put(subscriptionKey, subscriptions);
isRegisterSuccess = true;
}
//如果注冊(cè)的類(lèi)中不存在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);
}
- 構(gòu)造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);
}
發(fā)送事件
- 在EventBus中
EventBus.getDefault().post(new MessageEvent());
- 構(gòu)造RxBus相同的API
public class RxBus {
//省略第一步...
//省略第三步...
//省略第四步...
public void post (Object event) {
bus.onNext(event);
}
//省略第二步...
}
- 在RxBus中
RxBus.getDefault().post(new MessageEvent());
關(guān)于ThreadMode
在訂閱時(shí)根據(jù)需要使用RxJava的Schedulers即可。