[EventBus源码解析] 初探EventBus
2015-08-11 11:02
363 查看
本期blog作为EventBus(以下简称EB)学习的始动篇,主要记载了EB的功能、优点、使用方法,内容基于github上的README.md与HOWTO.md。
简洁:将事件分发者与接收者解耦,代码简单清晰;
快速:使用了反射,而不是在Android上效率低下的注解方式进行实现
轻量级:jar <50k
分发事件
接收事件
以上就是非常简单的EventBus使用方法,下面是部分进阶内容:)
PostThread: 默认的调用方式,在同一线程中启动。如无特别需求,皆应采取此方式。
MainThread: 在主线程(UI线程)中启动,应避免长时间操作阻塞主线程(ANR)。
BackgroundThread: EB使用固有的后台线程进行处理,也应当避免长时间操作造成阻塞。
Async: 异步处理,在主线程与后台线程之外启动新的线程,长时间操作应当用此模式。EB内建了线程池用于复用。
在接收者中以方法名onEventXXX来使用不同的线程模式。
更多的用法可以参阅javadoc
发送StickyEvent
接收StickyEvent
获取上一个StickyEvent
何为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
非核心功能,暂且略过不表。相关文章推荐
- Ubuntu 14.10 下安装Ambari 问题汇总
- SVG实战开发学习(七)——文字与声音
- hdu2594 KMP
- 安装Windows 10商店应用而不切换至微软账户的两种方法
- Ubuntu 64 + IntelliJ IDEA + Genymotion 搭建Android开发环境
- svn简易操作
- hdoj畅通工程
- 在线画时序图的工具:Web Sequence Diagrams ,支持实时生成预览图
- [leetcode-101]Symmetric Tree(c++)
- codeforce #200 div2 的水题三道
- HDU_3172_VirtualFriends
- 算法竞赛入门经典: 第四章 函数与递归 4.6解二元一次方程
- Android AnimationDrawable动画与APP启动引导页面
- 浅谈信息无障碍人才的培养
- [ Tomcat ] 自动更新脚本
- Android 5.0 API新增和改进
- swift-02代码流程的控制
- swift-02代码流程的控制
- HDU 4740 The Donkey of Gui Zhou
- 在 fragment 里面调用 findViewById