[EventBus源码解析] 初探EventBus
本期blog作为EventBus(以下简称EB)学习的始动篇,主要记载了EB的功能、优点、使用方法,内容基于github上的README.md与HOWTO.md。
何为EventBus
EB实现了Android上的一种事件分发/接收总线机制,其优点可以概括为以下三条:
- 简洁:将事件分发者与接收者解耦,代码简单清晰;
- 快速:使用了反射,而不是在Android上效率低下的注解方式进行实现
- 轻量级:jar <50k
EventBus的使用方法
将EventBus引入到项目中(gradle)
compile 'de.greenrobot:eventbus:2.4.0'
分发事件
eventBus.post(anyEvent);
接收事件
eventBus.register(this);
public void onEvent(AnyEvent e) {/* do something */};
以上就是非常简单的EventBus使用方法,下面是部分进阶内容:)
EB中不同的线程模式/ThreadMode
在实际开发中,往往需要根据需求的不同(是UI变化还是网络请求等),在不同的线程中进行逻辑处理。EB通过在接收者中使用不同的方法命名,为我们提供了简便的处理方法,无须深入到复杂的线程内部。
- PostThread: 默认的调用方式,在同一线程中启动。如无特别需求,皆应采取此方式。
- MainThread: 在主线程(UI线程)中启动,应避免长时间操作阻塞主线程(ANR)。
- BackgroundThread: EB使用固有的后台线程进行处理,也应当避免长时间操作造成阻塞。
- Async: 异步处理,在主线程与后台线程之外启动新的线程,长时间操作应当用此模式。EB内建了线程池用于复用。
在接收者中以方法名onEventXXX来使用不同的线程模式。
定制Custom EB
通常简便的获取EventBus实例是通过 EventBus.getDefault() 来获取单例,当需要对其进行定制时,可以通过EventBusBuilder进行。
EventBus eventBus = EventBus.builder().logNoSubscriberMessages(false).sendNoSubscriberEvent(false).build(); // 当没有对应接收者时,不发送消息
更多的用法可以参阅javadoc
定制Default EB
如果想对默认的EB单例进行定制,需要在初次调用EventBus.getDefault()之前进行,通常建议放在Application类中。
EventBus.builder().throwSubscriberException(BuildConfig.DEBUG).installDefaultEventBus();
终止Event分发
在onEvent中通过eventBus.cancelEventDelivery(event)可以终止该Event的继续分发
接收者优先级
具有更大优先级的接收者,会优先处理信息,可以搭配上一条(终止Event分发)使用。
int priority = 1;
EventBus.getDefault().register(this, priority);
Sticky Events
不知道怎样恰当翻译(粘性事件?)。EB内建了一个微型的缓存机制,可以保存最近一次以Sticky形式发送的Event,当接收者(须生命为Sticky)注册的时间晚于最近一个StickyEvent时,仍然可以接收到该Event。
发送StickyEvent
EventBus.getDefault().postSticky(someEvent);
接收StickyEvent
@Override
public void onStart() {
super.onStart();
EventBus.getDefault().registerSticky(this);
} public void onEvent(SomeEvent e) {
/* do something */
} @Override
public void onStop() {
EventBus.getDefault().unregister(this);
super.onStop();
}
获取上一个StickyEvent
EventBus.getDefault().getStickyEvent(Class<?> eomeEventType);
ProGuard配置
因为ProGuard会对方法名进行混淆,而EB是基于反射完成的,故需要在ProGuard文件(proguard.cfg)中配置特殊规则
-keepclassmembers class ** {
public void onEvent*(**);
} # Only required if you use AsyncExecutor
-keepclassmembers class * extends de.greenrobot.event.util.ThrowableFailureEvent {
<init>(java.lang.Throwable);
}
AsyncExcutor
非核心功能,暂且略过不表。
[EventBus源码解析] 初探EventBus的更多相关文章
- EventBus源码解析 源码阅读记录
EventBus源码阅读记录 repo地址: greenrobot/EventBus EventBus的构造 双重加锁的单例. static volatile EventBus defaultInst ...
- 【Android】EventBus 源码解析
EventBus 源码解析 本文为 Android 开源项目实现原理解析 中 EventBus 部分项目地址:EventBus,分析的版本:ccc2771,Demo 地址:EventBus Demo分 ...
- Android EventBus源码解析 带你深入理解EventBus
转载请标明出处:http://blog.csdn.net/lmj623565791/article/details/40920453,本文出自:[张鸿洋的博客] 上一篇带大家初步了解了EventBus ...
- andorid jar/库源码解析之EventBus
目录:andorid jar/库源码解析 EventBus: 作用: 用于不同Activity,Service等之间传递消息(数据). 栗子: A页面:onCreate定义 EventBus.ge ...
- Guava源码解析之EventBus
最近看Elastic-Job源码,看到它里面实现的任务运行轨迹的持久化,使用的是Guava的AsyncEventBus,一个内存级别的异步事件总线服务,实现了简单的生产-消费者模式,从而在不影响任务执 ...
- Android EventBus源码解析
项目地址 :https://github.com/greenrobot/EventBus 这个项目个人感觉就是为了解决回调事件过多的,比方说A函数在做完以后 要调用b类的c函数,那我们通常的做法就是 ...
- EventBus源码解析
用例 本文主要按照如下例子展开: //1. 新建bus对象,默认仅能在主线程上对消息进行调度 Bus bus = new Bus(); // maybe singleton //2. 新建类A(sub ...
- [EventBus源码解析] 订阅者处理消息的四种ThreadMode
前言 在前面,我们探讨了如何在自己的代码中引入EventBus,进行基本的事件分发/监听:对注册观察者与事件发送的过程进行了浅析.从之前的学习中,我们了解到,EventBus一共有4种onEvent方 ...
- 76.Android之EventBus源码解析
转载:http://p.codekk.com/blogs/detail/54cfab086c4761e5001b2538 1. 功能介绍 1.1 EventBus EventBus 是一个 Andro ...
随机推荐
- Fedora10下建立linux系统的窗口没有地址栏
Fedora10下建立的linux系统窗口没有地址栏 打开一个文件夹就打开一个窗口,还没有地址栏,这很麻烦也不习惯. 另:打开地址栏可以用组合键 Ctrl+L 如图 解决: edit---perfer ...
- Model2模型介绍
在JSP课程中有 Model1 模型的介绍 模型二: 实例接JSP课程,先去看JSP课程了
- android贪吃蛇(超级简陋版)
public class body { public int ax;//代表X周变量 public int ay;//代表Y轴变量 public int getAx() { return ax; } ...
- UITableViewCell左对齐的方法
if ([TabelView respondsToSelector:@selector(setLayoutMargins:)]) { [TabelView setLayoutMargin ...
- ViewHolder简洁写法
ViewHolder holder = null; if(convertView == null){ convertView = mInflater.i ...
- python分割字符串split,filter函数用法
现有字符串,需要取出用空格分隔的第一段,操作如下 >>> product_model = ‘WS-C2960G-24TC-L – Fixed Module 0′>>> ...
- UML学习笔记1
UML概述:是一种为面向对象软件设计提供的建模语言. 构成:事物things关系relationshs图diagrams UML事物:构件事物 行为事物 分组事物 注释事物 UML关系:依赖depen ...
- [转]深入理解学习GIT工作流
深入理解学习Git工作流 字数13437 阅读2761 评论3 喜欢70 个人在学习git工作流的过程中,从原有的 SVN 模式很难完全理解git的协作模式,直到有一天我看到了下面的文章,好多遗留在心 ...
- H5版俄罗斯方块(4)---火拼对战的雏形
前言: 勿忘初心, 本系列的目标是实现一款类似QQ"火拼系列"的人机对战版俄罗斯方块. 在完成了基本游戏框架和AI的算法探索后, 让我们来尝试一下人机大战雏形编写. 本系列的文章链 ...
- python request属性及方法说明
if request.REQUEST.has_key('键值'): HttpRequest对象的属性 参考: 表 H-1. HttpRequest对象的属性 属 性 描述 path 表示提 ...