多语言展示
当前在线:627今日阅读:152今日分享:13

android中EventBus详解一(eclipse版)

一、基础EventBus是一款greenrobot开发的针对Android优化的发布/订阅事件总线。主要功能是替代Intent、Handler、BroadCast在Fragment、Activity、Service、线程之间传递消息。优点是开销小,代码更优雅,以及将发送者和接收者解耦。二、进阶EventBus有4种订阅函数,这四种订阅函数都是使用onEvent开头的,它们的功能稍有不同:告知观察者事件发生时通过EventBus.post函数实现,这个过程叫做事件的发布,观察者被告知事件发生叫做事件的接收,是通过下面的订阅函数实现的。1、onEvent:如果使用onEvent作为订阅函数,那么该事件在哪个线程发布出来的,onEvent就会在这个线程中运行,也就是说发布事件和接收事件线程在同一个线程。使用这个方法时,在onEvent方法中不能执行耗时操作,如果执行耗时操作容易导致事件分发延迟。2、onEventMainThread:如果使用onEventMainThread作为订阅函数,那么不论事件是在哪个线程中发布出来的,onEventMainThread都会在UI线程中执行,接收事件就会在UI线程中运行,这个在Android中是非常有用的,因为在Android中只能在UI线程中跟新UI,所以在onEvnetMainThread方法中是不能执行耗时操作的。3、onEventBackground:如果使用onEventBackgrond作为订阅函数,那么如果事件是在UI线程中发布出来的,那么onEventBackground就会在工作线程中运行,如果事件本来就是工作线程中发布出来的,那么onEventBackground函数直接在该工作线程中执行。4、onEventAsync:使用这个函数作为订阅函数,那么无论事件在哪个线程发布,都会创建新的工作线程在执行onEventAsync。三、详解下面先介绍Activity与Activity之间的消息传递方法。
工具/原料
1

eclipse

2

EventBus 2.0

一、Activity与Activity之间的消息传递
1

首先,需要先到github下载greenrobot作者的EventBus的jar包,EventBus自3.0起改用Android Studio,但2.0以上版本仍然可以使用,直接下载2.0以上版本即可。并添加到libs目录下,注意android SDK版本过低的需要添加eclipse构建目录。

2

在使用EventBus之前需要事先把实体类准备好,比如:UserEntity、GoodsEntitiy等,就是存放一堆属性、一堆set/get方法等的实体类。

4

第二步需要在其中一个Activity中使用post方法发送消息,其参数就是创建好的实体类。

5

第三步需要在2个Activity中都添加EventBus的4种订阅函数其中之一,按需添加,但比如在第二个Activity中用post方法发送消息,则就在第一个Activity中的订阅函数中接收消息。到此就是EventBus中Activity和Activity之间的基础使用方法,十分简单便捷。

二、Activity与Fragment之间的消息传递
1

Activity与Fragment之间消息传递和上一节2个Activity之间消息传递类似。第一步依然是先有实体类,也就是需要传递的消息。

2

第二步注册和销毁订阅事件,这里需要注意Activity中注册的是对应的Fragment对象,而Fragment中注册的是getActivity()。

3

第三步仍然是将实体消息发送过去。

4

第四部就可以在Activity中看到从Fragment传递过来的消息了。图中加上了回调机制,你可以在Acitivity向Fragment传递消息中封装上一个实现了的接口,并添加方法,这样,在Fragment中就可以调用这个接口的方法,从而实现接口回调,然后就可以达到调用Activity的方法。接口回调和EventBus都可以实现相同的效果,但EventBus是不是更简洁一些呢?

三、Fragment与Fragment之间的消息传递
1

Fragment与Fragment间消息传递同上类似,而且它可以便捷的实现点击左侧分类改变右侧内容的特殊功能。此功能当然也可以用以下方法实现:方法一:显示或new创建fragment时直接使用set方法将参数/对象传递到fragment中,进行改变内容。方法二:就是上一节提到过的接口回调,这个比较高大上,就是在点击菜单时调用接口的方法,再到Fragment中调用接口的set方法实现接口,进而就可以拿到菜单数据,然后改变右侧内容。现在以上方法略过,只介绍使用EventBus实现此功能。

2

首先还是先有实体类,先固定写死初始化列表数据。

3

然后注册和销毁订阅事件,双方Fragment都直接用this注册和销毁。

4

再就该发送消息对象了,但再之前当然先加载列表数据,这里简而言之,只是也用到了EventBus消息传递,通过onEventMainThread在主线程接收方法实现。

5

点击列表数据将消息对象发送过去。

6

最后就可以在ItemDetailFragment右侧窗口改变内容了,同样也是需要在相同的onEventMainThread方法接收。

注意事项
1

EventBus2.0中消息传递双方都需要进行EventBus注册和销毁,以及填写接收消息的订阅方法,并且注意发送消息和接收消息所在的线程是否正确。

2

Activity之间传递消息时EventBus注册和销毁所用的是当前Activity的对象;Activity和Fragment之间消息传递的注册和销是用的对方的对象;Fragment之间消息传递时注册和销毁用的都是this,具体应该注册什么,看具体需求,一般是这样。

3

EventBus3.0相对更强大一些,目前这里2.0部分还需要注意EventBus的原理,通俗的说,是1、先注册;2、再发送消息;3、中间这里注意别忘还有一层加载布局的过程,否则会导致白白发送消息而不能显示;4、最后别忘销毁注册订阅事件。到这里EventBus应该就可以完全掌握了,赶快运用到实际项目试一试吧。

推荐信息