Android EventBus官方文档学习
来源:互联网 发布:科学怪人 知乎 编辑:程序博客网 时间:2024/05/29 13:48
原理
这是官方的一张图片说明,很能说明问题,毕竟官方是最权威的
Android传统的Intent,Handler,Broadcast或接口函数,在Fragment,Activity,Service线程之间传递数据,执行方法,这样做消息的发送者和接收者之间耦合就很高,
EventBus可以替代它们,将发布者和接收者(也说是订阅者)之间分离,
通过解耦发布者和订阅者简化Android事件传递
说白了EventBus就是 观察者设计模式。
使用步骤:
1. 将EventBus导入项目
Gradle 依赖 compile 'org.greenrobot:eventbus:3.0.0'
2. 定义事件-也就是传递的数据
(也就是一个没有任何特别要求的Java实体类)
public class MessageEvent { public final String message; public MessageEvent(String message) { this.message = message; }}
2. 准备观察者(也就是消息的接收者)
- 观察者需要实现事件处理方法,当事件消息被发送时,此方法将会被调用。
// This method will be called when a MessageEvent is posted (in the UI thread for Toast)@Subscribe(threadMode = ThreadMode.MAIN)public void onMessageEvent(MessageEvent event) { Toast.makeText(getActivity(), event.message, Toast.LENGTH_SHORT).show();}// This method will be called when a SomeOtherEvent is posted@Subscribepublic void handleSomethingElse(SomeOtherEvent event) { doSomethingWith(event);}
- 观察者必须先要注册才能接收事件event(注销),在activity和fragment中,可以根据生命周期来注册和注销EventBus.
@Overridepublic void onStart() { super.onStart(); EventBus.getDefault().register(this);}@Overridepublic void onStop() { EventBus.getDefault().unregister(this); super.onStop();}
3. 发送消息事件
你可以在任何地方发送消息,所有的已经注册的、并且匹配消息事件类型的观察者(消息接收者)都会收到该事件
EventBus.getDefault().post(new MessageEvent("Hello everyone!"));
注意:在写接收消息的方法是,方法名可以自定义,权限必须是public,参数必须是一个只要接收的参数类型是一致的,那么四个方法都可以接收到发送的信息
事件分发的线程:
处理多线程问题
1. ThreadMode.MAIN
表示这个方法在主线程中执行(适合做异步加载,可以将子线程加载到数据直接设置到UI界面里)
@Subscribe(threadMode = ThreadMode.MAIN) public void MessageEventBus(EventBusMessage eventBusMessage){ //在TextView显示接收的消息,从这个类里拿属性. tv_title.setText(eventBusMessage.Message); Log.d("eventBusThread","ThreadMode.MAIN "+Thread.currentThread().getName()); }
2. ThreadMode.POSTING
表示该方法和消息发送方在同一个线程.
@Subscribe(threadMode = ThreadMode.POSTING) public void MessageEventBus1(EventBusMessage eventBusMessage){ Log.d("eventBusThread","ThreadMode.POSTING "+Thread.currentThread().getName()); }
3. ThreadMode.ASYNC
- 也表示在后台执行(也就是子线程执行),可以异步并发处理
(适用于多个线程任务处理,内部有线程池管理,比如请求网络时,用这个方法,他会自动创建线程去请求) - 无论发布者是在子线程还是主线程,该方法都会创建一个子线程,在子线程执行.
@Subscribe(threadMode = ThreadMode.ASYNC) public void MessageEventBus2(EventBusMessage eventBusMessage){ Log.d("eventBusThread","ThreadMode.ASYNC "+Thread.currentThread().getName()); }
4. ThreadMode.BACKGROUND
- 表示该方法在后台运行(也就是子线程),不能够并发处理
- 如果发布者在子线程,那么该方法就在子线程执行
- 如果发布者在主线程,那么该方法就会创建一个子线程,在子线程运行.
@Subscribe(threadMode = ThreadMode.BACKGROUND) public void MessageEventBus3(EventBusMessage eventBusMessage){ Log.d("eventBusThread","ThreadMode.BACKGROUND "+Thread.currentThread().getName()); }
EventBus的黏性事件使用
一些带有重要数据的事件发布,例如,一个事件信号,一些初始化完成。或者如果你有传感器位置数据和你想抓住最近的值。 这些重要信息不需要我们来缓存,使用sticky event就可以了,EventBus会缓存最近发送的sticky event事件,然后sticky event可以交付给用户或显式查询。你不需要任何特殊的逻辑来考虑可用的数据。
如果一个sticky event在一段时间之前发送了
EventBus.getDefault().postSticky(new MessageEvent("Hello everyone!"));
现在有一个activity启动了,在注册的期间,所有的sticky观察者方法,将会立刻收到之前发送的sticky event.
@Overridepublic void onStart() { super.onStart(); EventBus.getDefault().register(this);}// UI updates must run on MainThread@Subscribe(sticky = true, threadMode = ThreadMode.MAIN)public void onEvent(MessageEvent event) { textField.setText(event.message);}@Overridepublic void onStop() { EventBus.getDefault().unregister(this); super.onStop();}
正因为上面所说的,所以有时需要手动检查事件,还可能需要删除事件,这样他们不会被发送了。这里是removeStickyEvent方法
MessageEvent stickyEvent = EventBus.getDefault().getStickyEvent(MessageEvent.class);// Better check that an event was actually posted beforeif(stickyEvent != null) { // "Consume" the sticky event EventBus.getDefault().removeStickyEvent(stickyEvent); // Now do something with it}
我们也可以重写上面的方法,如下:
MessageEvent stickyEvent = EventBus.getDefault().removeStickyEvent(MessageEvent.class);// Better check that an event was actually posted beforeif(stickyEvent != null) { // Now do something with it}
这里是参考的文档,如果上面的看不明白,可以参考一下官方文档
官方引导
官方文档
百度百科
- Android EventBus官方文档学习
- Android官方文档学习
- android官方文档学习记录
- Eventbus 3官方文档翻译(一)
- 使用官方帮助文档学习android
- android官方文档学习之Saving Data
- 【android-async-http】官方文档学习笔记
- android官方文档学习之路---ActionBar
- Android 官方 Training 文档学习总结
- Android EventBus学习总结
- Android EventBus学习
- Android EventBus学习
- Android EventBus学习笔记
- android EventBus 3.0 官方的混淆配置
- oracle官方文档学习
- golang官方学习文档
- android 官方SDK文档
- android官方文档
- Linux
- 【HAS】DASH库libdash代码结构解析
- 数据库----【基础篇】绪论-----数据库系统概述
- RNN简介
- HTTP 头部信息
- Android EventBus官方文档学习
- apt-get安装软件Unable to locate package错误解决办法
- 关于Java的Collection 全方面了解
- Android中moveTo、lineTo、quadTo、cubicTo、arcTo详解(实例)
- N26--第十五次博客作业
- centos7配置SSH免密码登陆
- 免安装版Tomcat双击应用程序闪退的解决办法
- 数据库设计原则
- 数据库架构