EventBus定义:是一个发布订阅事件的总线,主要功能是替代Intent,Handler,BroadCast在Fragment,Activity,Service,线程之间传递信息。
三要素:
- Event事件
- 订阅者
- 发布者
四种线程模式:
- POSTING (默认) 表示事件处理函数的线程跟发布事件的线程在同一个线程
- MAIN 表示事件处理函数的线程在主线程(UI)线程,因此在这里不能进行耗时操作
- BACKGROUND 表示事件处理函数的线程在后台线程,因此不能进行UI操作。如果发布事件的线程是主线程(UI线程),那么事件处理函数将会开启一个后台线程,如果果发布事件的线程是在后台线程,那么事件处理函数就使用该线程
- ASYNC 表示无论事件发布的线程是哪一个,事件处理函数始终会新建一个子线程运行,同样不能进行UI操作
基本用法:
订阅者可以订阅多个事件,发送者可以发布任何事件,发布者同时也可以是订阅者。
// Register订阅事件 //意思是让EventBus扫描当前类,把所有onEvent开头的方法记录下来,如何记录呢?使用Map记录到subscriptionsByEventType,Key为方法的参数类型,Value中包含我们的方法。 EventBus.getDefault().register(this); // 发布事件 //调用EventBus.getDefault().post(object)时,EventBus会根据post中实参的类型,去Map(subscriptionsByEventType)中查找对应的方法,最终调用反射去执行我们的方法 EventBus.getDefault().post(object)); // Unregister取消订阅 EventBus.getDefault().unregister(this);
订阅事件与发布事件:
如果方法名以onEvent开头,则代表要订阅一个事件。该事件是由哪个线程发布出来的,onEvent就会在这个线程中运行,也就是说发布事件和接收事件线程在同一个线程。
onEventMainThread:无论事件在哪个线程发布出来的,始终在UI线程中执行订阅事件的操作,当事件发布的时候,这个方法就会被执行。
onEventPostThread代表这个方法会在当前发布事件的线程执行
onEventBackground:这个方法,如果在非UI线程发布的事件,则直接执行,和发布在同一个线程中。如果在UI线程发布的事件,则加入后台任务队列,使用线程池一个接一个调用。
onEventAsync:使用这个函数作为订阅函数,那么无论事件在哪个线程发布,都会创建新的子线程在执行onEventAsync.