EventBus2.4.0源码浅析

之前写过一篇文章使用单例加上观者者模式来实现多页面联动: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 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方法

未完待续。。。

你可能感兴趣的:(EventBus2.4.0源码浅析)