详解EventBus 3.x 的快速使用
EventBus可以很方便地进行各组件间的通信,解耦性更强,比广播更好用。
EventBus3简介
EventBus是一种为了优化Android组件之间事件传递的解耦工具,通过发布/订阅事件总线来实现事件在不同组件之间的事件传递。
在EventBus3之前,greenrobot团队因为考虑性能原因所以比较抵触使用注解框架。目前的EventBus3开始使用注解来申明订阅事件的处理方法。虽然目前Android6和ART都有了,但是对于Java反射造成的性能影响还是没能很好的解决。
在EventBus3中,greenrobot团队通过利用在编译时检索所有注解代码,然后生成一个包含所有在运行时要花很大代价才能获取的数据的类,通过这种新的注解处理方式来提升性能,让EventBus3比其他的eventbus会更加快。在后文中会贴出和otto的性能比较。
EventBus3和EventBus2.x的区别
回调方法改动
由于API的改动,会导致EventBus3和之前使用老版本的EventBus不兼容,因为之前版本(EventBus2.x),在注册完事件之后,会要求写相应onEvent()方法,包括onEvent()、onEventAsync()、onEventBackground()、onEventMainThread()分别对应@Subscrible、@Subscrible(threadMode=ThreadMode.ASYNC)、@Subscribe(threadMode=ThreadMode.BACKGROUND)、@Subscribe(threadMode=ThreadMode.MAIN)。EventBus3中在未声明threadMob时,默认的线程模式为ThreadMode.POSTING。
异常容错处理
在EventBus3中,如果在@Subscrible标注的方法中,如果程序出错,不会立即使程序crash,而是由EventBus拦截异常,并打印错误日志。
用户可以通过EventBusBuilder来配置获取EventBus实例后的对象,来决定在处理event时是否需要抛出异常信息:
eventBus=EventBus.builder().sendNoSubscriberEvent(false) .sendSubscriberExceptionEvent(false) .throwSubscriberException(BuildConfig.DEBUG)//只有在debug模式下,会抛出错误异常 .build();
以上代码使用Builder设计模式,来构建返回一个eventBus实例。在调试阶段,可以在程序出现异常时直接Crash发现错误。
快速使用
1.编译
compile'org.greenrobot:eventbus:3.1.1'
2.自定义事件类
publicclassMessageEvent{
//成员变量根据自己的需求创建
privateinttype;
//通过构造方法传递数据
publicMessageEvent(inttype){
this.type=type;
}
publicintgetType(){
returntype;
}
publicvoidsetType(inttype){
this.type=type;
}
}
3.注册事件与解除注册
一般来说,在OnCreate()方法中进行注册:
@Override
protectedvoidonCreate(BundlesavedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_layout);
EventBus.getDefault().register(this);
}
与之对应的,在OnDestroy()中解除注册:
@Override
protectedvoidonDestroy(){
super.onDestroy();
EventBus.getDefault().unregister(this);
}
4.发送事件
EventBus.getDefault().post(newMessageEvent(type));
5.接收与处理事件
/**
*@Subscribe注解必须要写,线程需要指定
*方法名可随意
*/
@Subscribe(threadMode=ThreadMode.MAIN)
publicvoidonMessageEvent(MessageEventevent){
switch(event.getType()){
//doyourthing
}
}
上面提到了线程模型,它一共有5种:
- POSTING(默认):事件处理方法的线程跟发布事件的线程是同一个线程;
- MAIN:在Android中,事件处理方法在主线程(UI线程)中调用,不能进行耗时操作;
- MAIN_ORDERED:在Android中,事件处理方法在主线程(UI线程)中调用。与MAIN不同的是,该事件将始终排队等待发布,这确保了事件发布不会被阻塞;
- BACKGROUND:在Android中,事件处理方法在后台线程中调用,因此不能进行UI操作。如果发布事件的线程是主线程(UI线程),那么事件处理函数将会开启一个后台线程,如果果发布事件的线程是在后台线程,那么事件处理函数就使用该线程;
- ASYNC:无论事件发布的线程是哪一个,事件处理方法始终会新建一个子线程运行,不能进行UI操作。
以上便是EventBus的最基本的使用,是不是很方便呢。希望对大家的学习有所帮助,也希望大家多多支持毛票票。