美文网首页
EventBus2.4.0源码浅析

EventBus2.4.0源码浅析

作者: af274772f108 | 来源:发表于2017-03-13 17:29 被阅读88次

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

    未完待续。。。

    相关文章

      网友评论

          本文标题:EventBus2.4.0源码浅析

          本文链接:https://www.haomeiwen.com/subject/rokqnttx.html