EventBus 3.0使用基础
EventBus概述
EventBus是一款针对Android优化的发布/订阅事件总线。主要功能是替代Intent,Handler,BroadCast在Fragment,Activity,Service,线程之间传递消息.优点是开销小,代码更优雅。以及将发送者和接收者解耦。
1、下载EventBus
compile 'org.greenrobot:eventbus:3.0.0'
Maven
<dependency>
<groupId>org.greenrobot</groupId>
<artifactId>eventbus</artifactId>
<version>3.0.0</version>
</dependency>
基本使用
1、首先每个事件写一个实体bean,EventBus就是根据这个实体bean来判断事件分发的
public class EventBusBean{
}
EventBus.getDefault().register(this);
3、实现处理方法
在3.0以前一直是通过以下4个方法名来实现消息处理
a、onEvent
b、onEventMainThread
c、onEventBackgroundThread
d、onEventAsync
每个方法名都有不同的含义
onEvent:如果使用onEvent作为订阅方法,那么该事件在哪个线程发布出来的,onEvent就会在这个线程中运行,也就是说发布事件和接收事件线程在同一个线程。使用这个方法时,在onEvent方法中不能执行耗时操作,如果执行耗时操作容易导致事件分发延迟。
onEventMainThread:如果使用onEventMainThread作为订阅方法,那么不论事件是在哪个线程中发布出来的,onEventMainThread都会在UI线程中执行,接收事件就会在UI线程中运行,这个在Android中是非常有用的,因为在Android中只能在UI线程中跟新UI,所以在onEvnetMainThread方法中是不能执行耗时操作的。
onEventBackground:如果使用onEventBackgrond作为订阅方法,那么如果事件是在UI线程中发布出来的,那么onEventBackground就会在子线程中运行,如果事件本来就是子线程中发布出来的,那么onEventBackground函数直接在该子线程中执行。
onEventAsync:使用这个函数作为订阅方法,那么无论事件在哪个线程发布,都会创建新的子线程在执行onEventAsync. 实现处理方法有4个方法可以实现,不用继承或实现任何接口,只需要在你注册的类中添加方法就行了,当然方法名是有限制的,参数就是你要传递的消息对象
但是3.0以后就不在用这种方式了,而是通过注解的方式
通过注解@Subscribe来确定实现的方法,当然还需要方法的形参,只是把以前的特定方法名改为不特定,而是通过注解,同时通过threadMode来设定线程,一共有4种方式,同以前一样
a、ThreadMode.POSTING 同onEvent
b、ThreadMode.MAIN 同onEventMainThread
c、ThreadMode.BACKGROUND 同onEventBackground
d、ThreadMode.ASYNC 同onEventAsync
如:@Subscribe(threadMode = ThreadMode.POSTING)
比如我们用onEventMainThread来注册,这样onEventMainThread方法体会在UI线程去执行
public void onEventMainThread(EventBusBean bean){
...
}
4、发送消息
EventBus.getDefault().post(new EventBusBean());
或者
EventBus.getDefault().postSticky(new EventBusBean());
5、取消注册
当一个类被销毁或者生命周期完成时,我们要及时取消注册,以免造成内存泄露
EventBus.getDefault().unregister(this);