PS一句:最终还是选择CSDN来整理发表这几年的知识点,该文章平行迁移到CSDN。因为CSDN也支持MarkDown语法了,牛逼啊!

【工匠若水 http://blog.csdn.net/yanbober】

开源项目链接

EventBus项目:https://github.com/greenrobot/EventBus
EventBusDemo下载:https://github.com/yanbober/Android-Blog-Source/tree/master/Android-EventBus-Demo

背景介绍

如果你学习过设计模式,那么当想通知其他组件某些事情发生时你一定会使用观察者模式。好了,既然能想到这个设计模式,那么就来看一个屌爆天的Android开源框架EventBus。主要功能是替代Intent、Handler、BroadCast在Fragment、Activity、Service、线程之间传递消息。他的最牛逼优点是开销小,代码简洁,解耦代码。

基础介绍

上面说了,EventBus是一个观察者模式的实现,既然这样,那他就有如下三个要素:

  • Event:事件
  • Subscriber:事件订阅者,接收特定的事件。
  • Publisher:事件发布者,用于通知Subscriber有事件发生。

其中,Event可以使任意类型对象。Subscriber都是以约定的onEvent开头的函数,具体是onEvent,onEventMainThread,onEventBackgroundThread,onEventAsync这四个。Publisher可以通过post(Object)在任意线程任意位置发送事件。

官方这个图就很直观的说明了这种观察者模式的架构:

依据开源库组件的说明文档来操作:

  1. 在工程gradle中添加:compile ‘de.greenrobot:eventbus:2.4.0’。
  2. 按照文档HOWTO.md进行操作。

Subscriber以onEvent开头的4个函数区别:

  • onEvent:事件的处理在和事件的发送在相同的线程,所以事件处理时间不应太长,不然影响事件的发送线程。

  • onEventMainThread: 事件的处理会在UI线程中执行。事件处理时间不能太长,长了会出现臭名远之的ANR。

  • onEventBackgroundThread:事件的处理会在一个后台线程中执行。虽然名字是BackgroundThread,事件处理是在后台线程,但事件处理时间还是不应该太长,因为如果发送事件的线程是后台线程,会直接在当前后台线程执行事件;如果当前线程是UI线程,事件会被加到一个队列中,由一个线程依次处理这些事件,如果某个事件处理时间太长,会阻塞后面的事件的派发或处理。

  • onEventAsync:事件处理会在单独的线程中执行,主要用于在后台线程中执行耗时操作,每个事件会开启一个线程,但最好限制线程的数目。

下面还是先上代码再总结分析。

实战一把屌爆天的功能

如下示例演示了EventBus的线程间通信与线程内通信及自定义消息结构的通信。

下载该实例工程完整代码点击我

如下是主界面显示效果:

接着看代码:

首先自定义一个消息数据类型,如下:

public class MsgBean {private String msg;public MsgBean(String msg) {this.msg = msg;}public String getMsg() {return msg;}public void setMsg(String msg) {this.msg = msg;}
}

接着编写主界面及逻辑代码:

public class MainActivity extends AppCompatActivity implements View.OnClickListener {private TextView mShowInfo1, mShowInfo2, mShowInfo21, mShowInfo22;private Button mBtn1, mBtn2, mBtn21, mBtn22;private int mCount = 0;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);initData();}private void initData() {mShowInfo1 = (TextView) findViewById(R.id.first_show);mBtn1 = (Button) findViewById(R.id.get_btn_1);mBtn1.setOnClickListener(this);mShowInfo2 = (TextView) findViewById(R.id.second_show);mBtn2 = (Button) findViewById(R.id.get_btn_2);mBtn2.setOnClickListener(this);mShowInfo21 = (TextView) findViewById(R.id.first_show_lin2);mBtn21 = (Button) findViewById(R.id.get_btn_1_line2);mBtn21.setOnClickListener(this);mShowInfo22 = (TextView) findViewById(R.id.second_show_line2);mBtn22 = (Button) findViewById(R.id.get_btn_2_line2);mBtn22.setOnClickListener(this);}@Overrideprotected void onStart() {super.onStart();//注册EventBusEventBus.getDefault().register(this);}@Overrideprotected void onStop() {super.onStop();//取消EventBusEventBus.getDefault().unregister(this);}//事件1接收者:在主线程接收public void onEvent(String event){mShowInfo1.setText(event);}//事件2接收者:在主线程接收自定义MsgBean消息public void onEvent(MsgBean event){mShowInfo21.setText(event.getMsg());}//事件3接收者:在主线程接收public void onEventMainThread(Integer event) {mShowInfo2.setText(event+"");}@Overridepublic void onClick(View v) {switch (v.getId()) {case R.id.get_btn_1://事件1发送者:在主线程发送EventBus.getDefault().post("test!");break;case R.id.get_btn_1_line2://事件2发送者:在主线程发送自定义MsgBean消息EventBus.getDefault().post(new MsgBean("type"));break;case R.id.get_btn_2://事件3发送者:在子线程循环发送new Timer().schedule(new TimerTask() {@Overridepublic void run() {EventBus.getDefault().post(mCount);if (mCount >= 3) {this.cancel();mCount = 0;}mCount++;}}, 0, 1000);break;}}
}

xml代码太简单就省略了。

如下运行结果:

下载该实例工程完整代码点击我

从上面代码可以看见,当发过来一个消息的时候,EventBus区分onEventxxx被调运通过发送消息的参数类型区分(如:post(new MsgBean(“type”))对应onEvent(MsgBean event),post(“test!”)对应onEvent(String event))。

总结

通过上面基础实战发现,使用EventBus的基本步骤就是如下4步:

  1. 定义事件类型(或者不定义)。例如:MsgBean等
  2. 定义事件处理方法。例如:onEvent等
  3. 注册订阅者。例如:EventBus.getDefault().register(this)
  4. 发送事件。例如:EventBus.getDefault().post(new MyEvent())

通过这个例子基本上你就可以上手EventBus框架使用了,也知道了大致基本原理。其实这还是不够,玩意出现bug又很郁闷不知道怎么改,所以下一篇还是老规矩,走读一下EventBus的大致源码,学习下作者的代码思想,同时熟悉EventBus的原理。

【工匠若水 http://blog.csdn.net/yanbober】
继续阅读本系列下一篇《EventBus框架库代码走读》

EventBus使用之基础相关推荐

  1. android eventbus使用,EventBus使用之基础

    开源项目链接 背景介绍 如果你学习过设计模式,那么当想通知其他组件某些事情发生时你一定会使用观察者模式.好了,既然能想到这个设计模式,那么就来看一个屌爆天的Android开源框架EventBus.主要 ...

  2. 响应式编程在Android 中的一些探索

    响应式在前端领域已经变得十分流行,很多主流框架都采用响应式来进行页面的展示刷新.本文主要是探索一下响应式在移动端Android上的一些实践,包括对响应式思想的理解,以及目前Android上实现响应式的 ...

  3. (三) Nepxion-Thunder分布式RPC集成框架 - 结构管理

    Nepxion-Thunder(QQ 群 471164539)发布在https://github.com/Nepxion/ 1. 类结构 1.1 cluster:负载均衡和远程注册中心集群服务地址同步 ...

  4. 美团猫眼android模块化实战-可能是最详细的模块化实战

    转载请注明出处: 美团猫眼电影android模块化实战–可能是最详细的模块化实战 地址:http://blog.csdn.net/qq_22744433/article/details/7794844 ...

  5. 美团猫眼电影android模块化实战--可能是最详细的模块化实战

    转载请注明出处: 美团猫眼电影android模块化实战–可能是最详细的模块化实战 地址:http://www.jianshu.com/p/d372cc6802e5 目录 1 写这篇博客的初衷 首先一句 ...

  6. EventBus基础

    一.EventBus简介 # EventBus is a publish/subscribe event bus for Android and Java. # EventBus是一个事件发布/订阅框 ...

  7. Vue2基础-Vue2.x 多层级组件数据通信 EventBus 和 Vuex

    多层级组件间通信 如果我们使用vue提供的prop和emit实现会很麻烦,需要层层嵌套.下面介绍的两种方式可以解决该问题. EventBus EventBus的使用也很简单. 我们先定义个EventB ...

  8. 『Android基础入门』:EventBus实现总线数据分发

  9. Android之EventBus框架源码解析下(源码解析)

    转载请标明出处:[顾林海的博客] 个人开发的微信小程序,目前功能是书籍推荐,后续会完善一些新功能,希望大家多多支持! 前言 EventBus是典型的发布订阅模式,多个订阅者可以订阅某个事件,发布者通过 ...

最新文章

  1. Win7中如何删除word模板
  2. ios开发学习笔记--调用相册或相机(UIImagePickerController)
  3. Tensorflow快速入门2--实现手写数字识别
  4. NCEMASLG-32G的说明
  5. Winform Datagridview 单元格html格式化支持富文本
  6. windows XP下DCOM的权限配置
  7. 数据结构 - 单链表(百度面试题单链表的倒序打印)
  8. EasyUI DataGrid 中字段 formatter 格式化不起作用
  9. Linux下的tree命令 --Linux下目录树查看
  10. JavaScript基础知识必知!
  11. python直方图均衡_Python实现图像直方图均衡化算法
  12. 巨杉数据库入选Gartner数据库报告,中国首家入选厂商
  13. 0031 Java学习笔记-梁勇著《Java语言程序设计-基础篇 第十版》英语单词
  14. MCSE 2012 R2之工作文件夹Word Folders(2)
  15. 遭遇爆炸式匿名*** 瑞星称有人下黑手
  16. 专家系统实例及其骨架系统
  17. 数据建模:个人信用分是怎么计算出来的?
  18. 常用moment时间总结
  19. 长沙民政职业技术学院计算机网络技术专业,长沙民政职业技术学院计算机网络技术专业...
  20. Faiss相似性搜索类库

热门文章

  1. 潘多拉固件设置ipv6_openwrt-LEDE系统IPV6设置教程
  2. deli考勤机3960操作手册
  3. 编写一个shell脚本,使其能够备份/etc目录下所有文件,并且备份的文件名需要自动生成日期,即产生后缀名形如.backup_20210624的文件。
  4. 十进制转二、八、十六进制
  5. Neo4j3-Neo4j基础操作(中)
  6. Python小程序之购买商品
  7. veket+linux+v7,veket linux安装工具
  8. 定时器Timer(一)—— 定时器Timer的使用
  9. win10 Python3.9.5安装报错0x80070652
  10. 一名准菜鸟程序员(bushi)的自我介绍