EventBus

加强记忆,提升学习效果,仅此而已!


EventBus是一款针对Android优化的发布/订阅事件总线。主要功能是替代Intent,Handler,BroadCast在Fragment,Activity,Service,线程之间传递消息.优点是开销小,代码更优雅。以及将发送者和接收者解耦。

简单使用

下载EventBus的类库

源码:https://github.com/greenrobot/EventBus

基本使用

(1)自定义一个类,可以是空类,比如:

1.  public class AnyEventType {  
2.       public AnyEventType(){}  
3.   } 

(2)在要接收消息的页面注册:

1.  @Override  
2.      public void onCreate(Bundle savedInstanceState)  
3.      {  
4.          super.onCreate(savedInstanceState);  
5.          // Register  
6.          EventBus.getDefault().register(this);  
7.      }  

(3)发送消息

1.  eventBus.post(new AnyEventType event);  

(4)接受消息的页面实现(共有四个函数,各功能不同,这是其中之一,可以选择性的实现,这里先实现一个):

1.  public void onEvent(AnyEventType event) {
2.  }  

(5)解除注册

1.    @Override  
2.      public void onDestroy()  
3.      {  
4.          super.onDestroy();  
5.          // Unregister  
6.          EventBus.getDefault().unregister(this);  
7.      }

主要元素

元素介绍
Event事件
Subscriber事件订阅者,接收特定的事件
Publisher事件发布者,用于通知Subscriber有事件发生
SubscribMethodSubscriber内某一特定的onEvent*方法,内部成员包含一个Method类型的method成员表示这个onEvent*方法,一个ThreadMode成员threadMode表示事件的处理线程,一个Class<?>类型的eventType成员表示事件的类型EventType
Subscription表示一个订阅对象,包含订阅源Subscriber,订阅源中的某一特定方法SubscribMethod,这个订阅的优先级priopity

Event

Event可以是任意类型的对象。

Subscriber

在EventBus中,使用约定来指定事件订阅者以简化使用。即所有事件订阅都都是以onEvent开头的函数,具体来说,函数的名字是onEvent,onEventMainThread,onEventBackgroundThread,onEventAsync这四个,这个和ThreadMode有关,后面再说。

Publisher

可以在任意线程任意位置发送事件,直接调用EventBus的post(Object)方法,可以自己实例化EventBus对象,但一般使用默认的单例就好了:EventBus.getDefault(),根据post函数参数的类型,会自动调用订阅相应类型事件的函数。

四个订阅函数

ThreadMode

前面说了,Subscriber函数的名字只能是那4个,因为每个事件订阅函数都是和一个ThreadMode相关联的,ThreadMode指定了会调用的函数。有以下

1、onEvent
2、onEventMainThread
3、onEventBackgroundThread
4、onEventAsync

这四种订阅函数都是使用onEvent开头的,它们的功能稍有不同,在介绍不同之前先介绍两个概念:

告知观察者事件发生时通过EventBus.post函数实现,这个过程叫做事件的发布,

观察者被告知事件发生叫做事件的接收,是通过下面的订阅函数实现的。

订阅函数介绍
onEvent:如果使用onEvent作为订阅函数,那么该事件在哪个线程发布出来的,onEvent就会在这个线程中运行,也就是说发布事件和接收事件线程在同一个线程。使用这个方法时,在onEvent方法中不能执行耗时操作,如果执行耗时操作容易导致事件分发延迟。
onEventMainThread:如果使用onEventMainThread作为订阅函数,那么不论事件是在哪个线程中发布出来的,onEventMainThread都会在UI线程中执行,接收事件就会在UI线程中运行,这个在Android中是非常有用的,因为在Android中只能在UI线程中跟新UI,所以在onEvnetMainThread方法中是不能执行耗时操作的
onEventBackground:如果使用onEventBackgrond作为订阅函数,那么如果事件是在UI线程中发布出来的,那么onEventBackground就会在子线程中运行,加入后台任务队列,使用线程池一个接一个调用(在执行的方法里面加了一个线程锁–synchronized),如果事件本来就是子线程中发布出来的,那么onEventBackground函数直接在该子线程中执行。
onEventAsync:使用这个函数作为订阅函数,那么无论事件在哪个线程发布,都会创建新的子线程在执行onEventAsync,注意没有BackgroundThread中的一个接一个

发送时:

1.  EventBus.getDefault().post(new FirstEvent("FirstEvent btn clicked"));    

接收时:

1.  public void onEventMainThread(FirstEvent event) {    
2.      ……  
3.  }  

注意:
发送时发送的是这个类的实例,接收时参数就是这个类实例。
所以!!!!!!当发过来一个消息的时候,EventBus怎么知道要调哪个函数呢,就看哪个函数传进去的参数是这个类的实例,哪个是就调哪个。那如果有两个是呢,那两个都会被调用!!!!

问题一:能否通过不同的参数来重载onEventMainThread()这个方法???以达到通过不同的参数来调用的目的,简化结构。
经测试,是可行的

实现原理:

onEventMainThread()是何时与Handler建立连接的,使得能更新UI?

在onCreate里面执行 EventBus.getDefault().register(this);意思是让EventBus扫描当前类,把所有onEvent开头的方法记录下来,如何记录呢?使用Map,Key为方法的参数类型,Value中包含我们的方法。
(onCreate时,EventBus扫描当前类,将onEventMainThread以键值对的形式进行存储,键为Item.class ,值为包含该方法的对象。)

这样在onCreate执行完成以后,我们的onEventMainThread就已经以键值对的方式被存储到EventBus中了。

然后当子线程执行完毕,调用EventBus.getDefault().post(new ItemListEvent(Item.ITEMS))时,EventBus会根据post中实参的类型,去Map中查找相应的方法,于是找到了我们的onEventMainThread,最终调用反射去执行我们的方法。

———————————————-分割线—————————————————-

基本使用:
Android EventBus实战 没听过你就out了 - Hongyang - 博客频道 - CSDN.NET
Android EventBus源码解析 带你深入理解EventBus - Hongyang - 博客频道 - CSDN.NET
EventBus使用详解(一)——初步使用EventBus - harvic - 博客频道 - CSDN.NET
EventBus使用详解(二)——EventBus使用进阶 - harvic - 博客频道 - CSDN.NET

对比:
Android学习系列(43)–使用事件总线框架EventBus和Otto - 谦虚的天下 - 博客园
http://www.cnblogs.com/qianxudetianxia/p/4216949.html
Android事件总线 ( AndroidEventBus ) 开源库发布 - Mr.Simple的专栏 - 博客频道 - CSDN.NET
http://blog.csdn.net/bboyfeiyu/article/details/43450553
消息总线EventBus源码分析以及与Otto框架对比(二) | 江清清的技术专栏
http://www.lcode.org/%E6%B6%88%E6%81%AF%E6%80%BB%E7%BA%BFeventbus%E6%BA%90%E7%A0%81%E5%88%86%E6%9E%90%E4%BB%A5%E5%8F%8A%E4%B8%8Eotto%E6%A1%86%E6%9E%B6%E5%AF%B9%E6%AF%94%E4%BA%8C/?utm_source=tuicool&utm_medium=referral
消息总线EventBus源码分析以及与Otto框架对比 - 推酷
http://www.tuicool.com/articles/yuIRvun

源码:
事件总线 EventBus的设计 - small.ming - 博客园
http://www.cnblogs.com/MartinChen999/archive/2011/12/21/2294034.html
Android组件间通信库EventBus学习 - djun100的专栏 - 博客频道 - CSDN.NET
http://blog.csdn.net/djun100/article/details/23762621
Android解耦库EventBus的使用和源码分析 - Android学习之旅 - 博客频道 - CSDN.NET
http://blog.csdn.net/yuanzeyao/article/details/38174537
EventBus源码研读(上)|开源实验室-张涛
http://www.kymjs.com/code/2015/12/12/01/
快速Android开发系列通信篇之EventBus - AngelDevil的专栏 - 博客频道 - CSDN.NET
http://blog.csdn.net/andevil/article/details/28270607
RxJava和EventBus的区别? - 吵吧的回答 - 知乎
https://www.zhihu.com/question/32179258/answer/54989242

其他:
《Android解耦库EventBus的使用和源码分析》:http://blog.csdn.net/yuanzeyao/article/details/38174537
《EventBus的使用初试》:
http://blog.csdn.net/pp_hdsny/article/details/14523561
《EventBusExplained 》:
https://code.google.com/p/guava-libraries/wiki/EventBusExplained
《Google Guava EventBus实例与分析》:http://www.xiaoyaochong.net/wordpress/index.php/2013/11/17/google-guava-eventbus%E5%AE%9E%E4%BE%8B%E4%B8%8E%E5%88%86%E6%9E%90/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值