登录不老阁

 
注册成功

二呆

diamond@tongleer.com

岂能尽如人意,但求无愧我心。

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

2017-5-27 二呆 Android 1317观看

一、基础

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


« 热伤风了怎么办? | 【Android】MIUI主题编辑器使用入门及连接手机的方法»

  • 觉得很赞 (0)
  • 打赏
  • X
    打赏
    • 微信
    • QQ红包
    • 支付宝


    用微信扫一扫

    您的鼓励将是站长及作者前行的动力,谢谢打赏
    (若二维码有误可举报)

发表评论:

快乐贰呆的关注更多 >

小草窝博客

博主是一名天朝的学生,喜欢折腾各种奇怪的语言,喜欢探索未知的事情

图床

微博图床

搜索

标签

Genymotion Button HTML 腾讯视频 Win10 火腿肠意面 MIUI 主题编辑器 Android emlog pjax EventBus AndroidStudio 快捷键 倒计时 工具类 eclipse javascript 励志语录 自定义Dialog Demo java 热伤风 redis RabbitMQ ZeroMQ ActiveMQ Kafka Jafka php 鸡蛋饼 直播 继承 面向对象 工厂模式 AutoCompleteTextView GridView RadioButton ToggleButton Android开发入门 EditText CheckBoxes 控件 TimePicker AnalogClock DigitalClock ProgressBar SeekBar RatingBar UI控件 Spinner ScrollView Adapter 单元测试 Dialog 自定义对话框 Android项目 布局 Android视频 Java4Android Android开发教程 学习札记 基本数据类型 运算符和流程控制 流程控制循环语句 数组 数组二 二维数组 安卓基础 安卓监听器 表格布局 帧布局 网格布局 Android异常 AndroidIO XML XML解析 用户登录 数据存储 SQLite内部数据存储 Unity3D教程 Linux subversionSVN TortoiseSVN ViewPager Fragment 预加载 Android实战开发 唯一识别码 锁屏 Activity CheckBox ListView 增删改查 图片回收处理 内存溢出 仿2列商品列表 AndroidNDK eclipse插件 jni开发 jni调用 so文件 Androidmk配置 Flash 绘制图形 苹果 图标 变形工具 滤镜 Flash特效 简单薄餐 Flash滤镜 Flash动画 Android开发 天气预报 醋溜白菜 香菇烩豆腐 微波豆腐蒸蛋 速成凉拌豆腐 杜子建 穷根 男装搭配 黄帝内经 大蒜洋葱粥 情商密码 中华药粥 交际红人 小白菜萝卜粥 每日一笑 完美国际 故梦 一卷情长 Ukulele 白熊音乐 零基础 指弹 教程 白桦树娃娃 新加坡 网红美食 海南鸡饭

公众号

同乐儿

链接更多 >