Android事件总线分发库EventBus3.0的简单讲解与实践
Android事件总线分发库EventBus的简单讲解与实践
导语,EventBus大家应该不陌生,EventBus是一款针对Android优化的发布/订阅事件总线。主要功能是替代Intent,Handler,BroadCast在Fragment,Activity,Service,线程之间传递消息.优点是开销小,代码更优雅。以及将发送者和接收者解耦。反正能帮助我们快速开发,这个确实是个好东西,其实鸿洋大神已经对源码作了一个较全面的剖析了
我这里就简单的聊聊怎么去使用和实践了,在这里,要感谢一下开原作者,也就是《Android源码设计模式解析和实战》的作者何红辉
EventBus已经更新到了3.0了,也优化得更多好了,推荐使用3.0及以上版本,这里先放上一张GitHub上的介绍图
好的,我们一步步来分析这张图
一.概念
既然是个库,我们首先要做的,肯定是引入他的依赖了
compile 'org.greenrobot:eventbus:3.0.0'
如果是Eclipse,那就自行去Github上下载jar包添加到libs目录下
这里我们要明白一个概念,就是事件总线管理,明白了事件总线管理,你就知道这个库的妙用了,我们分三点来概述
- 将事件放在队列里,用于管理和分发
- 保证应用的各个部分之间高效的通信及数据,事件分发
- 模块间的解耦
当然啦,这样说可能有点笼统,我们再来分析一下,关于事件总线,一共四个部分
- 发布者
- 订阅者
- 事件
- 总线
这也就迎合我们事件总线的思想了,订阅者可以订阅多个事件,发布者也可以发布任何事件,发布者同时也可以是订阅者,他的步骤
- 订阅
- 注册
- 发布
- 取消注册
现在是不是对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之后,我们看官方文档
事件处理就需要这样使用了
/*
*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());
}
这样一个简单的事件订阅,接收就完成了,我们来看一下效果
这里我所讲的可能稍微简单点,但是EventBus真的是一个很容易上手,又强大的库,如果细心又爱专研的同学去github上看一下,也就大概的了解了一个思路,我作为一个老司机,也只是抛砖引玉了
Demo下载:http://download.csdn.net/detail/qq_26787115/9514941
我的群,通往Android的神奇之旅 :555974449,欢迎大家进来交流技术!
Android事件总线分发库EventBus3.0的简单讲解与实践的更多相关文章
- 45、Android事件总线分发库的使用
事件总线分发库EventBus和Otto的简介及对比 什么是事件总线管理: a.将事件放到队列里,用于管理和分发b.保证应用的各个部分之间高效的通信及数据.事件分发c.模块间解耦 Event Bus是 ...
- Android事件总线(一)EventBus3.0用法全解析
前言 EventBus是一款针对Android优化的发布/订阅事件总线.简化了应用程序内各组件间.组件与后台线程间的通信.优点是开销小,代码更优雅,以及将发送者和接收者解耦.如果Activity和Ac ...
- Android事件总线(二)EventBus3.0源码解析
1.构造函数 当我们要调用EventBus的功能时,比如注册或者发送事件,总会调用EventBus.getDefault()来获取EventBus实例: public static EventBus ...
- Android事件的分发机制
在分析Android事件分发机制前,明确android的两大基础控件类型:View和ViewGroup.View即普通的控件,没有子布局的,如Button.TextView. ViewGroup继承自 ...
- 【第三篇】学习 android 事件总线androidEventbus之发布事件,子线程中接收
发送和接收消息的方式类似其他的发送和接收消息的事件总线一样,不同的点或者应该注意的地方: 1,比如在子线程构造方法里面进行实现总线的注册操作: 2,要想子线程中接收消息的功能执行,必须启动线程. 3, ...
- 【第三篇】学习 android 事件总线androidEventbus之list数据事件的传递,发送list数据事件到另外一个Activity
这个和普通的事件总线的发送接收一样. package com.example.mysimpleeventbus; import java.util.ArrayList; import java.uti ...
- 【第一篇】学习 android 事件总线androidEventbus之sticky事件的传递
最近再看eventbus相关代码,首先从使用开始,后期再从源码角度分析eventbus.使用Demo后期公布到github上去. 使用的框架地址:https://github.com/bboyfeiy ...
- Android事件总线EventBus详解
顾名思义,AndroidEventBus是一个Android平台的事件总线框架,它简化了Activity.Fragment.Service等组件之间的交互,很大程度上降低了它们之间的耦合,使我们的代码 ...
- Android事件总线还能怎么玩?
作者简介:何红辉,Android工程师,现任职于友盟. 顾名思义,AndroidEventBus是一个Android平台的事件总线框架,它简化了Activity.Fragment.Service等组件 ...
随机推荐
- MySQL EXTRACT() 函数
定义和用法 EXTRACT() 函数用于返回日期/时间的单独部分,比如年.月.日.小时.分钟等等. 语法 EXTRACT(unit FROM date) date 参数是合法的日期表达式.unit 参 ...
- 利用QrCode.Net生成二维码 asp.net mvc c#
利用QrCode.Net生成二维码 asp.net mvc c# 里面介绍了.net的方式及js的方式,还不错. 里面用到的qrcode.net的类库下载地址:https://qrcodenet.co ...
- cassandra 概述
摘要 本篇文章主要是介绍cassandra与其他NoSQL的区别以及自身的特点与应用场景.在关系数据库我们没必要选择数据库,通常需要适配oracle/mysql/sql server/db2 等多种数 ...
- linux找不到动态链接库 .so文件的解决方法(转自:http://www.cnblogs.com/xudong-bupt/p/3698294.html)
linux找不到动态链接库 .so文件的解决方法 如果使用自己手动生成的动态链接库.so文件,但是这个.so文件,没有加入库文件搜索路劲中,程序运行时可能会出现找不到动态链接库的情形. 可以通过ldd ...
- HTTP状态码总结
HTTP状态码(HTTP Status Code)是用以表示网页服务器HTTP响应状态的3位数字代码.有些 App 端接口与 HTML 接口用的是同一个,所以做移动端开发也有必要了解一下HTTP状态码 ...
- JavaEE介绍
相关术语 为什么需要JavaEE 我们编写的JSP代码中,由于大量的显示代码和业务逻辑混淆在一起,彼此嵌套,不利于程序的维护和扩展.当业务需求发生变化的时候,对于程序员和美工都是一个很重的负担.为了程 ...
- ROS_Kinetic_x ROS栅格地图庫 Grid Map Library
源自:https://github.com/ethz-asl/grid_map Grid Map Overview This is a C++ library with ROS interface t ...
- 假设一个大小为100亿个数据的数组,该数组是从小到大排好序的,现在该数组分成若干段,每个段的数据长度小于20「也就是说:题目并没有说每段数据的size 相同,只是说每个段的 size < 20 而已」
假设一个大小为100亿个数据的数组,该数组是从小到大排好序的,现在该数组分成若干段,每个段的数据长度小于20「也就是说:题目并没有说每段数据的size 相同,只是说每个段的 size < 20 ...
- Dynamics CRM2016 业务流程之Task Flow(一)
Task Flow 属于CRM移动端的特性,如果在项目实施中用不到CRM自带的APP或者对自APP不感冒的,那就没有往下看的必要了,移步吧. 该功能默认是不开启的,需要我们去系统设置中开启它,打勾,选 ...
- 2.2、Android Studio通过注解提升代码检测
使用像Lint这样的代码检测工具可以帮助你发现问题和提升代码,但是代码检测在有些地方很难应用.例如,Android的资源ID,使用一个int类型来表示字符.图像.颜色或者其他资源类型所以代码检测工具不 ...