前因
因为公司项目中使用EventBus,所以需要进行了解,本来还以为EventBus会很难理解,但是网上查了一下,发现上手很快,而且也没有什么特别难懂的地方,这篇文章记录我对EventBus的一些理解
使用场景
经常会遇到,有时候发生了一个事件,需要在别的activity或者Fragment或者其他类中进行处理,以前我们是通过广播去实现,但是当一个Activity需要处理很多种事件时,广播管理起来就会麻烦很多,尤其是对于一些多线程之间的消息,用广播和handler固然可以,但是消息过多处理起来就比较麻烦了,所以EventBus就出现了(以上纯属个人理解)
EventBus概述
EventBus是一款针对Android优化的发布/订阅事件总线。主要功能是替代Intent,Handler,BroadCast在Fragment,Activity,Service,线程之间传递消息.优点是开销小,代码更优雅。以及将发送者和接收者解耦。
1、下载EventBus
github
gradle
1 | compile 'org.greenrobot:eventbus:3.0.0' |
Maven
1 | <dependency> |
基本使用
1、首先每个事件写一个实体bean,EventBus就是根据这个实体bean来判断事件分发的
1 | public class EventBusBean{ |
就创建一个空类就可以,当然如果需要通过消息传递什么对象,那个对象的类就是这个类文件
2、在要接受消息的页面注册EventBus
1 | 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线程去执行
1 | public void onEventMainThread(EventBusBean bean){ |
4、发送消息
1 | EventBus.getDefault().post(new EventBusBean()); |
或者
1 | //postSticky 发送粘性消息,同粘性广播相同,发送后会保存,在后面注册的也能接收到 |
5、取消注册
当一个类被销毁或者生命周期完成时,我们要及时取消注册,以免造成内存泄露
1 | EventBus.getDefault().unregister(this); |