Android事件总线分发库EventBus3.0的简单讲解与实践
2017-05-26 10:25
381 查看
总结:
1、onUserEvent重复执行多次的原因:是由重复注册引起的([b]EventBus.getDefault().register(this))。[/b]
2、订阅者可以是任何类,不一定是Activity、Fragment等组件,在任意类A订阅(EventBus.getDefault().register(classA);)的话,要在类A内部处理onEvent事件。
3、发布者可以在任何地方。如类A是订阅者,A页面跳转到B,B又new了一个C,类C执行了EventBus.getDefault().post(...),[b]类A同样可以接收得到。[/b]
导语,EventBus大家应该不陌生,EventBus是一款针对Android优化的发布/订阅事件总线。主要功能是替代Intent,Handler,BroadCast在Fragment,Activity,Service,线程之间传递消息.优点是开销小,代码更优雅。以及将发送者和接收者解耦。反正能帮助我们快速开发,这个确实是个好东西,其实鸿洋大神已经对源码作了一个较全面的剖析了
基本用法
Android EventBus源码解析 带你深入理解EventBus
我这里就简单的聊聊怎么去使用和实践了,在这里,要感谢一下开原作者,也就是《Android源码设计模式解析和实战》的作者何红辉
地址:https://github.com/greenrobot/EventBus
EventBus已经更新到了3.0了,也优化得更多好了,推荐使用3.0及以上版本,这里先放上一张GitHub上的介绍图
![](https://oscdn.geek-share.com/Uploads/Images/Content/202011/05/3c2b3baebd53e46932f82c96c983ff7d)
好的,我们一步步来分析这张图
既然是个库,我们首先要做的,肯定是引入他的依赖了
如果是Eclipse,那就自行去Github上下载jar包添加到libs目录下
jar地址:http://search.maven.org/#search%7Cga%7C1%7Cg%3A%22de.greenrobot%22%20AND%20a%3A%22eventbus%22
这里我们要明白一个概念,就是事件总线管理,明白了事件总线管理,你就知道这个库的妙用了,我们分三点来概述
将事件放在队列里,用于管理和分发
保证应用的各个部分之间高效的通信及数据,事件分发
模块间的解耦
当然啦,这样说可能有点笼统,我们再来分析一下,关于事件总线,一共四个部分
发布者
订阅者
事件
总线
这也就迎合我们事件总线的思想了,订阅者可以订阅多个事件,发布者也可以发布任何事件,发布者同时也可以是订阅者,他的步骤
订阅
注册
发布
取消注册
现在是不是对EventBus有一个大概的轮廓啦?现在我们理解这张图就简单多了,发布者把事件发布到总线里面再进行分发
我们按照流程来
一句话就注册,当然,他里面不光可以传上下文,还可以传类和事件订阅参数
取消注册同样的,里面也可以和注册一样传递参数,我们后面详细说
发布有两种
直接发布
滞留发布
这也是他的一个优势的地方,在3.0之前的版本,我们是这样的
3.0之后,我们看官方文档
http://greenrobot.org/files/eventbus/javadoc/3.0/
事件处理就需要这样使用了
我们可以注解在方法名上面标记,Subscribe是订阅者的意识,我们定义一个threadMode ,四种模式
MainThread
BackgroundThread
Async
PostThread
大意就是这样,不知道大家理解了多少?总的来说,就是注册了之后,就可以,比如我这边发送一个消息数据,你那边就可以接收了
我们直接来一个小例子吧,例子也是非常的简单,在一个地方发送一个数据消息事件,另一个地方去接收,这个应该不难,大家都知道做,我们新建一个工程——EventBus
![](https://oscdn.geek-share.com/Uploads/Images/Content/202011/05/44b2f3ece0ccf75dea4eaef0710f0943)
我们首先注册,在把取消注册绑定在onDestroy()上,不多说,这里我们的主布局没什么东西,一个按钮点击发送,一个textview去接收
我们还需要一个实体类去保存数据
接着,我们在Button的点击事件中去发送我们的自定义消息
然后我们在主线程汇总接收这个消息
这样一个简单的事件订阅,接收就完成了,我们来看一下效果
![](https://oscdn.geek-share.com/Uploads/Images/Content/202011/05/8bcbf3de4dee982d47bdec035a75154d)
转自http://www.cnblogs.com/aixiaomei/p/6309835.html
1、onUserEvent重复执行多次的原因:是由重复注册引起的([b]EventBus.getDefault().register(this))。[/b]
2、订阅者可以是任何类,不一定是Activity、Fragment等组件,在任意类A订阅(EventBus.getDefault().register(classA);)的话,要在类A内部处理onEvent事件。
3、发布者可以在任何地方。如类A是订阅者,A页面跳转到B,B又new了一个C,类C执行了EventBus.getDefault().post(...),[b]类A同样可以接收得到。[/b]
导语,EventBus大家应该不陌生,EventBus是一款针对Android优化的发布/订阅事件总线。主要功能是替代Intent,Handler,BroadCast在Fragment,Activity,Service,线程之间传递消息.优点是开销小,代码更优雅。以及将发送者和接收者解耦。反正能帮助我们快速开发,这个确实是个好东西,其实鸿洋大神已经对源码作了一个较全面的剖析了
基本用法
Android EventBus源码解析 带你深入理解EventBus
我这里就简单的聊聊怎么去使用和实践了,在这里,要感谢一下开原作者,也就是《Android源码设计模式解析和实战》的作者何红辉
地址:https://github.com/greenrobot/EventBus
EventBus已经更新到了3.0了,也优化得更多好了,推荐使用3.0及以上版本,这里先放上一张GitHub上的介绍图
好的,我们一步步来分析这张图
一.概念
既然是个库,我们首先要做的,肯定是引入他的依赖了compile 'org.greenrobot:eventbus:3.0.0'
如果是Eclipse,那就自行去Github上下载jar包添加到libs目录下
jar地址:http://search.maven.org/#search%7Cga%7C1%7Cg%3A%22de.greenrobot%22%20AND%20a%3A%22eventbus%22
这里我们要明白一个概念,就是事件总线管理,明白了事件总线管理,你就知道这个库的妙用了,我们分三点来概述
将事件放在队列里,用于管理和分发
保证应用的各个部分之间高效的通信及数据,事件分发
模块间的解耦
当然啦,这样说可能有点笼统,我们再来分析一下,关于事件总线,一共四个部分
发布者
订阅者
事件
总线
这也就迎合我们事件总线的思想了,订阅者可以订阅多个事件,发布者也可以发布任何事件,发布者同时也可以是订阅者,他的步骤
订阅
注册
发布
取消注册
现在是不是对EventBus有一个大概的轮廓啦?现在我们理解这张图就简单多了,发布者把事件发布到总线里面再进行分发
二.讲解
我们按照流程来
1.注册
//注册 EventBus.getDefault().register(this);
一句话就注册,当然,他里面不光可以传上下文,还可以传类和事件订阅参数
2.取消注册
@Override protected void onDestroy() { super.onDestroy(); //取消注册 EventBus.getDefault().unregister(this); }
取消注册同样的,里面也可以和注册一样传递参数,我们后面详细说
3.发布
发布有两种直接发布
滞留发布
//直接发布,接收对象 EventBus.getDefault().post("发布"); //滞留发布 EventBus.getDefault().postSticky("滞留发布");
4.订阅处理数据
这也是他的一个优势的地方,在3.0之前的版本,我们是这样的//主线程事件处理 public void onEvent(MessageEvent event) { log(event.message); } //交互式线程事件处理 public void onEventMainThread(MessageEvent event) { textField.setText(event.message); } //后台线程处理 public void onEventBackgroundThread(MessageEvent event) { saveToDisk(event.message); }
3.0之后,我们看官方文档
http://greenrobot.org/files/eventbus/javadoc/3.0/
事件处理就需要这样使用了
/* *UserEvent需要自己定义 */ //在ui线程执行 @Subscribe(threadMode = ThreadMode.MainThread) public void onUserEvent(UserEvent event) { } //在后台线程执行 @Subscribe(threadMode = ThreadMode.BackgroundThread) public void onUserEvent(UserEvent event) { } //强制在后台执行 @Subscribe(threadMode = ThreadMode.Async) public void onUserEvent(UserEvent event) { } //默认方式, 在发送线程执行 @Subscribe(threadMode = ThreadMode.PostThread) public void onUserEvent(UserEvent event) { }
我们可以注解在方法名上面标记,Subscribe是订阅者的意识,我们定义一个threadMode ,四种模式
MainThread
BackgroundThread
Async
PostThread
大意就是这样,不知道大家理解了多少?总的来说,就是注册了之后,就可以,比如我这边发送一个消息数据,你那边就可以接收了
三,实践
我们直接来一个小例子吧,例子也是非常的简单,在一个地方发送一个数据消息事件,另一个地方去接收,这个应该不难,大家都知道做,我们新建一个工程——EventBus我们首先注册,在把取消注册绑定在onDestroy()上,不多说,这里我们的主布局没什么东西,一个按钮点击发送,一个textview去接收
layout_main.xml
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:layout_margin="15dp" android:gravity="center" android:orientation="vertical"> <Button android:id="@+id/btn_send" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="发送事件" /> <TextView android:id="@+id/tv_content" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginTop="20dp" android:textColor="@color/colorAccent" android:textSize="20sp" /> </LinearLayout>
我们还需要一个实体类去保存数据
UserEvent
package com.lgl.eventbus; /** * 实体类 * Created by lgl on 2016/5/9. */ public class UserEvent { /** * 这里你传递什么类型你就写什么类型 */ //文本 private String text; public String getText() { return text; } public void setText(String text) { this.text = text; } }
接着,我们在Button的点击事件中去发送我们的自定义消息
@Override public void onClick(View v) { switch (v.getId()) { case R.id.btn_send: //发送自定义消息 UserEvent event = new UserEvent(); event.setText("我是萌哒哒的消息!"); EventBus.getDefault().post(event); break; } }
然后我们在主线程汇总接收这个消息
//主线程接收消息 @Subscribe(threadMode = ThreadMode.MAIN) public void onUserEvent(UserEvent event) { //如果多个消息,可在实体类中添加type区分消息 tv_content.setText(event.getText()); }
这样一个简单的事件订阅,接收就完成了,我们来看一下效果
转自http://www.cnblogs.com/aixiaomei/p/6309835.html
相关文章推荐
- Android事件总线分发库EventBus3.0的简单讲解与实践
- Android事件总线分发库EventBus3.0的简单讲解与实践
- Android开源框架——事件总线 EventBus3.0讲解
- android事件总线EventBus3.0简单使用
- 可能是讲解Android事件分发最好的文章
- android View的点击事件分发机制的简单认知
- 可能是讲解Android事件分发最好的文章
- 通俗易懂,可能是讲解 Android 事件分发最好的文章
- Android的Touch事件分发机制简单探析
- 45、Android事件总线分发库的使用
- android事件总线EventBus3.0使用方法详解
- android事件总线EventBus3.0使用方法详解
- Android IOC 之 注解绑定控件 以及事件 事例 代码简单注释讲解
- [简单]Android中的事件分发各方法
- 可能是讲解Android事件分发最好的文章
- 【转载】更简单的学习Android事件分发
- 更简单的学习Android事件分发
- Android事件总线(一)EventBus3.0用法全解析
- 【Android事件分发】从简单的onTouch理解Android事件分发
- Android 事件分发 OnClickListener 和 OnTouchListener 的事件处理原理简单描述