Android EventBus 介绍
来源:互联网 发布:ip地址与设备mac绑定 编辑:程序博客网 时间:2024/05/29 17:53
———–EventBus——–
首先,EventBus顾名思义,就是一个事件总线,简化了很多事件处理的繁琐代码,例如Handler。
介绍分两步,一步是用例,一步是源码解析,相对于网上的教程,我的比较简单,适合初步了解。
1、用例
public class TestA extends Activity{
public void onCreated(Bundle savedInstanceState){EventBus eventbus=EventBus.getDefault();eventbus.register(this);runtest();} public void onEvent(FinishEvent event){ //事件event处理代码} public void runtest(){ eventbus.post(new FinishEvent);}
public class FinishEvent{}
这就是一个简单的用例了,在TestA中:
1、用EventBus.getDefault()得到EventBus对象
2、使用register方法注册当前TestA,并在TestA中建立onEvent()方法
3、使用post将事件FinishEvent加入到EventBus的总线上,系统将会自动执行onEvent()方法
2、下面结合源码对上述例子进行解析:
首先我们看register(this)方法:
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); } }
传进来的subscriber,也就是我们的TestA对象, findSubscriberMethods(subscriber.getClass())中,是得到TestA对象中,所有类似于onEvent的方法(subscriberMethod)。
可以看到,我们的onEvent方法,只包含了一个参数,源码中,把subscriberMethod的参数叫做EventType,所以,我们可以推断中,一个subscriber中,可以对应多个subscriberMethod,一个subscriberMethod,对应一个EventType。
接下来看register(this)中的subscribe方法,可以看到,每个subscriber的subsriberMethod都要执行一次这个函数,在这个函数里,出现了subscription(subscriber,subscribermethod),看定义函数就知道一个subscription对应着一个subscriber和一个subscriber中的一个method。这个函数就是用已有的subscriber和method产生subscription。
弄清楚subscriber,subscription,subscriberMethod和EventType的关系就很好办了,再看源码就非常之easy。接下来让我们轻松的看post函数:
public void post(Object event) {PostingThreadState postingState = currentPostingThreadState.get(); List<Object> eventQueue = postingState.eventQueue; eventQueue.add(event); ............... while (!eventQueue.isEmpty()) { postSingleEvent(eventQueue.remove(0), postingState); } ......... }
这是一部分关键代码,eventQueue很容易知道就是一个事件排队,就像收银台一样一个一个去执行。传入的是Event,也就是EventType参数。
为什么要传入EventType参数呢?
因为,EventBus的原理就是根据传入的EventType参数,找到所有scription中此EventType对应的subscriptionMethod,然后去执行它,也就是说,假设subsriberA和subsriberB,都含有onEvent(FinishEvent e),那么当你传入new FinishEvent()的时候,subscriberA和B的方法都会执行!看到这里是不是清楚了很多?
接下来进入postingSingleEvent(EventType e)
代码不难,主要就是根据函数名字来选择在什么线程上执行这个函数。在例子中,subscriberMethod的名字为onEvent(),实际上,这个名字是有相关规定的,分四种,这四种分别决定了subscriberMethod对象中的一个属性—ThreadMode
- onEvent
- onEventMainThread
- onEventBackgroundThread
- onEventAsync
这四种的含义,字面意思上就可以理解,EventBus就讲到这里,本篇博客只适合初步了解,你可以在草稿纸上,稍微画一下subscriber,subscriberMethod,subscription,EventType之间的关系,这样会比较清晰,当然啦,如要深入了解,请点下面链接:
http://www.cnblogs.com/angeldevil/p/3715934.html
他写的比我好哈哈哈!
- Android EventBus 介绍
- android EventBus基础介绍
- Android--EventBus的使用介绍
- Android EventBus 内部机制介绍
- Android 之 EventBus(一)简单介绍
- Android EventBus简单介绍(一)
- Android EventBus简单介绍(二)
- EventBus介绍
- EventBus介绍
- EventBus介绍
- EventBus介绍
- EventBus介绍
- EventBus介绍
- EventBus介绍
- Android eventBus
- android EventBus
- android-eventbus
- android eventbus
- Spring JdbcTemplate方法详解
- LeetCode---(155)Min Stack
- spring框架学习(一)
- 算法之回溯思想
- HTTP协议及其POST与GET操作差异 & C#中如何使用POST、GET等【重要理解】
- Android EventBus 介绍
- Hibernate 实体关联关系映射
- LeetCode 题解(145): Single Number
- 【Developing Log】PHP的coding环境安装
- 连按两次返回键退出应用
- spring框架学习(二)依赖注入
- iOS TextField属性大全
- Activiti初学者の教程
- spring框架学习(三)junit单元测试