Android EventBus框架的使用
2016-07-18 22:29
459 查看
EventBus框架
EventBus是一个Android端优化的publish/subscribe消息总线,简化了应用程序内各组件间、组件与后台线程间的通信。比如请求网络,等网络返回时通过Handler或Broadcast通知UI,两个Fragment之间需要通过Listener通信,这些需求都可以通过EventBus实现。EventBus是一种基于观察者模式的框架,类似的框架还有RXJava,Agera之类的,总之都是一类的东西,学会一个的话很容易触类旁通.
添加依赖
compile 'de.greenrobot:eventbus:3.0.0-beta1'
注册观察者
在Context 中注册观察者@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); // 将此Context注册给EventBus // 成为观察者 EventBus.getDefault().register(this); }
取消注册
@Override protected void onDestroy() { super.onDestroy(); // 取消注册 EventBus.getDefault().unregister(this); }
EventBus.getDefault()是获取该EventBus的对象,该对象为单例
添加事件,任何Object对象都可以被描述为事件
/** * Created by yangtianrui on 16-7-18. * 这是一个可以抛出的事件 * <p/> * 所有可以实例化成Object的类都是一个事件 */ public class DriverEvent { public String info; public DriverEvent(String info) { this.info = info; } public DriverEvent() { } }
对事件的处理
/** * 此处通过注解,编写事件处理函数 * * @param driverEvent */ @Subscribe(threadMode = ThreadMode.PostThread, priority = 0, sticky = true) public void handleEvent(DriverEvent driverEvent) { Toast.makeText(this, driverEvent.info, Toast.LENGTH_SHORT).show(); } public void btn_post_event(View view) { EventBus.getDefault().post(new DriverEvent("OK")); }
threadMode表示线程模型,常见的线程模型有四种:分别是PostThread(默认)、MainThread、BackgroundThread与Async。
PostThread:如果使用事件处理函数指定了线程模型为PostThread,那么该事件在哪个线程发布出来的,事件处理函数就会在这个线程中运行,也就是说发布事件和接收事件在同一个线程。在线程模型为PostThread的事件处理函数中尽量避免执行耗时操作,因为它会阻塞事件的传递,甚至有可能会引起ANR。
MainThread:如果使用事件处理函数指定了线程模型为MainThread,那么不论事件是在哪个线程中发布出来的,该事件处理函数都会在UI线程中执行。该方法可以用来更新UI,但是不能处理耗时操作。
BackgroundThread:如果使用事件处理函数指定了线程模型为BackgroundThread,那么如果事件是在UI线程中发布出来的,那么该事件处理函数就会在新的线程中运行,如果事件本来就是子线程中发布出来的,那么该事件处理函数直接在发布事件的线程中执行。在此事件处理函数中禁止进行UI更新操作。
Async:如果使用事件处理函数指定了线程模型为Async,那么无论事件在哪个线程发布,该事件处理函数都会在新建的子线程中执行。同样,此事件处理函数中禁止进行UI更新操作。
发送事件
public void btn_post_event(View view) { EventBus.getDefault().post(new DriverEvent("OK")); }
使用post方法发送事件后,所有注册观察者的对象(使用注解处理事件)都可以收到事件推送,在注解方法中实现对事件的处理.
发送粘性事件
粘性事件: 就是在发送事件之后再订阅该事件也能收到该事件,跟黏性广播类似。EventBus.getDefault().postSticky(new MessageEvent("test"));
粘性事件的处理函数:
@Subscribe(sticky = true) public void XXX(MessageEvent messageEvent) { ...... }
相关文章推荐
- LinearLayout的weight
- Android中自定义属性
- Android下数据库创建
- (OK)(OK) compile_mongoose_4_android-x86_64-6.0.txt
- 相对布局 竖直居中
- (OK) SEEM - mongoose-android-x86 - index.html
- mac os x 10.11.5编译msm8916 android4.4.4
- IOS Android支持中文与本地文件的读取写入
- 【黑马Android】(18)Servlet/ServletConfig/ServletContext
- Gradle 下载及代理设置
- Android开发——利用productFlavors实现一套代码打包多版本
- MeasureSpec.UNSPECIFIED, MeasureSpec.EXACTLY, MeasureSpec.AT_MOST
- android 布局滑动中scrollTo 和 scrollBy 方法使用说明
- Android中文API(141) —— GridLayout
- Android静态安全检测 -> Intent隐式调用
- Android studio ,新建项目相关介绍
- android-studio ,下载安装 链接
- 编译android系统
- Android学习
- android studio 中的NDK开发(1)