2516天 Mr.贰呆

唯一自信的就是自己的人品。
寻求王者玩家一起开黑净化峡谷环境​​

【Android】中EventBus 2.0消息传递使用详解(eclipse版)

发布于 / 3111 次围观 / 0 条评论 / Android / 二呆 /

一、基础

EventBus是一款针对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。

三、消息传递详解

(1)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方法等的实体类。

3、然后就可以使用EventBus了,第一步需要在2个Activity中的onCreate和onDestory等成对生命周期方法中都分别注册和销毁EventBus。

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

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

(2)Activity与Fragment间消息传递

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

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

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

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

(2)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应该就可以完全掌握了,赶快运用到实际项目试一试吧。


sitemap