EventBus的使用
来源:互联网 发布:云记事本 php源码 编辑:程序博客网 时间:2024/06/06 03:06
EventBus的使用
EventBus是一个Android平台上的事件发送/订阅框架,采用观察者模式实现,可以优化组件间的信息传递过程。
基本的使用
1. 定义events
Events通常是一个POJO(plain old Java object).可以根据需要,随便定义。可以定义多种类型的events,事件处理函数根据事件的类型实现重载。events除了自定义,还可以是Java中的基本类型(int, boolean等)。
public class MessageEvent{ public String message; public MessageEvent(String message){ this.message = message; }}
2. 注册订阅者
只有需要接收events的地方,才需要注册订阅者。只是发送事件的话,不必注册。
在Acitvity中注册和注销订阅者:
@Override public void onStart() { super.onStart(); EventBus.getDefault().register(this); } @Override public void onStop() { EventBus.getDefault().unregister(this); super.onStop(); }
3. 添加events处理函数
其实添加events处理函数也是注册订阅者的一部分,它们俩一起完成了注册任务。
在注册了订阅者的地方,添加事件处理函数。
// This method will be called when a MessageEvent is posted public void onEvent(MessageEvent event){ Toast.makeText(getActivity(), event.message, Toast.LENGTH_SHORT).show(); } // This method will be called when a SomeOtherEvent is posted public void onEvent(SomeOtherEvent event){ doSomethingWith(event); }
有两点需要注意:
- 事件处理函数必须有参数,且只能有一个参数。函数根据这个参数的类型,实现重载的功能。
- 事件处理函数的名字必须以onEvent开头,且必须是以下四种:
- onEvent
- onEventMainThread
- onEventBackgroundThread
- onEventAsync
4. 发送events
可以在任何地方发送一个事件。所有注册了这个事件类型的订阅者都可以收到它。
EventBus.getDefault().post(new MessageEvent("Hello everyone!"));
这里有两点需要注意:
- 如果event是基本类型,发送时event会被自动装箱。因此事件处理函数(onEvent)的参数类型必须是基本类型对应的对象类型。
所有注册了event对象的父类的订阅者,都可以收到这个event。也就是说,如果某个订阅者的某个事件处理函数的参数是Object类型
onEvent(Object object)
那么所有发出去的event,它都可以收到。
线程模型
EventBus可以自动处理线程问题,使我们从后台线程与UI线程的切换中解放出来。
在EventBus中,通过约定事件处理函数名称的方式,决定在哪个线程中执行事件处理方法。
onEvent
对应PostThread模型,事件处理函数将会在事件发送者的线程上执行。这种模式,不需要切换线程,是最快速的,推荐默认采用。onEventMainThread
对应MainThread模型,事件处理函数将会在主线程上执行。onEventBackgroundThread
对应BackgroundThread模型,如果发送线程不是主线程,那么事件处理函数将会直接在发送线程调用。如果发送线程是主线程,那么EventBus会启用一个后台线程执行事件处理函数。onEventAsync
对应Async模型,EventBus会启用一个单独的线程(既不是发送线程,又不是主线程)执行事件处理函数。EventBus会使用线程池,重用线程。
设定优先级
可以在注册的时候,设置订阅者的优先级。
int priority = 1; EventBus.getDefault().register(this, priority);
高优先级的订阅者,可以先接收到事件。默认的优先级是0.
这里有一点需要注意,用官方文档的话说就是:
Note: the priority does NOT affect the order of delivery among subscribers with different ThreadModes!
也就是说,两个订阅者:subscribe1和subscribe2,subscribe1的优先级较高,那么subscribe1的onEvent函数肯定比subscribe2的onEvent函数先接收到事件,onEventBackgroundThread函数也肯定比subscribe2的onEventBackgroundThread优先。但是不能比较subscribe1的onEvent和subscribe2的onEventBackgroundThread,因为它们的线程模型不同,可能在不同的线程上。
取消events的传递
高优先级的订阅者可以在事件处理函数中取消事件的传递。
// Called in the same thread (default) public void onEvent(MessageEvent event){ // Process the event ... EventBus.getDefault().cancelEventDelivery(event) ; }
Sticky Events
Sticky Events可以用于需要延迟接收事件的情况。
普通的事件发送出去以后,EventBus便不再持有了,因此后续注册的订阅者无法接收到它。但是sticky事件不同,EventBus会在内存中为每一种事件类型保存一个最新发送的事件,直到后续发送新的sticky事件,把它覆盖掉。因此后续注册的订阅者,依然可以从内存中得到这个已发送的sticky事件。
发送sticky事件:
EventBus.getDefault().postSticky(new MessageEvent("Hello everyone!"));
注册sticky订阅者:
@Override public void onStart() { super.onStart(); EventBus.getDefault().registerSticky(this); } public void onEventMainThread(MessageEvent event) { textField.setText(event.message); } @Override public void onStop() { EventBus.getDefault().unregister(this); super.onStop(); }
也可以直接直接获得某个类型的sticky事件:
EventBus.getDefault().getStickyEvent(Class<?> eventType)
有两点需要注意:
- sticky类型的订阅者,依然可以收到普通类型的event;但是普通类型的订阅者收不到sticky类型的event
- 某个类型,只有最新的事件才会被保存
- EventBus 《二》 Android EventBus的简单使用
- EventBus的使用初试
- EventBus的使用
- EventBus的使用
- EventBus的简单使用
- EventBus的使用
- eventbus的使用
- EventBus的初步使用:
- EventBus的使用
- EventBus的简单使用
- EventBus的使用总结
- EventBus的使用
- EventBus框架的使用
- EventBus的简单使用
- Eventbus的基本使用
- EventBus的使用
- EventBus的使用
- EventBus的简单使用
- leetcode-14-Longest Common Prefix
- hdu1042 - N!
- plsql编程语言示例
- 自己分装Php分页类
- js实现关于分页的一种实现方式
- EventBus的使用
- 浅谈辅助功能 AccessibilityService
- linux c之pipe的使用例子
- Tomcat工作原理(四)-tomcat默认连接器
- FusionChartsFree免费的报表
- plsql编程语言 if 判断示例
- JavaScript中的AMD规范以及dojo中的AMD(程序员之家)
- ZCMU—1728
- android系统架构及源码目录结构