之前写过一篇文章使用单例加上观者者模式来实现多页面联动:http://www.jianshu.com/p/29f17fdc47a7
其实我们完全可以使用greenrobot开源的EventBus来替代它。
通过阅读EventBus源码我们可以发现它本质上也是个观察者模式。
EventBus有如下的优势:
1、简化了组件间的通讯。
2、分离了事件的发送者和接受者。
3、在Activity、Fragment和线程中表现良好。
4、避免了复杂的和易错的依赖关系和声明周期问题。
5、使得代码更简洁,性能更好,解耦合
下面先简单的介绍下eventbus的使用,假设如下的一个业务场景:有ABC三个activity在同一个栈,现在点击C页面的一个按钮,A和B两个页面各自执行自己的操作。下面是我的代码实现:
public class FirstActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
EventBus.getDefault().register(this);
}
public void onEvent(ClickEvent event){
//// TODO: 2017/3/16
}
@Override
protected void onDestroy() {
EventBus.getDefault().unregister(this);
super.onDestroy();
}
}
public class SecondActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
EventBus.getDefault().register(this);
}
public void onEvent(ClickEvent event){
//// TODO: 2017/3/16
}
@Override
protected void onDestroy() {
EventBus.getDefault().unregister(this);
super.onDestroy();
}
}
public class ThirdActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
initEvent();
}
private void initEvent(){
View view = new View(this);
view.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
ClickEvent event = new ClickEvent("");
EventBus.getDefault().post(event);
}
});
}
}
public class ClickEvent {
private String params;
public ClickEvent(String params){
this.params = params;
}
public String getParams(){
return params;
}
}
我们先来看eventbus的register方法
private synchronized void register(Object subscriber, boolean sticky, int priority) {
List<SubscriberMethod> subscriberMethods = subscriberMethodFinder.findSubscriberMethods(subscriber.getClass());
for (SubscriberMethod subscriberMethod : subscriberMethods) {
subscribe(subscriber, subscriberMethod, sticky, priority);
}
}
该方法传入Object对象并拿到Object对象的Class对象,然后通过反射的方法获取class对象中的方法名为onEvent的Method对象。EventBus内部维护这样的一个HashMap,它的key的eventType,value是个CopyOnWriteArrayList,这个List的泛型是内部封装着eventType相对应的Method对象的一个类。EventBus每次register,内部都会从Hashmap中拿出当前eventType对象的List,并把新的onEvent的Method对象add到list中。同样,EventBus每次调用unRegister,都会从对应的list中remove掉当前类对应的method对象。
下面我们来看看EventBus的post方法
未完待续。。。
网友评论