EventBus简述:
EventBus基于观察者模式,把发送事件者和接受事件者分开的一种发布/订阅事件总线框架。
EventBus原理:
注册原理:
当通过API getDefault()函数的时候它是通过构建者模式初始化EventBus 相关属性,
获取EventBus实例,调用API register函数的时候,根据入参的上下文获取注册类的class对象
通过反射获取带有subscriber注解的方法并添加到集合,循环遍历,完成注册。
发送消息原理:
通过调用post API发送事件,获取当前线程队列把所要发送的事件添加到队列中,在循环遍历队列把每个事
件传递给 EventByus核心方法 postSingleEvent方法处理,判断是否已经订阅了此事件的类型,如果已经订
阅就会判 断订阅事件方法的线程模式,进行匹配发送,接受者就会接受到此事件,进行先关的逻辑的操
作。
EventBus 线程调度:
EventBus 事件5种线程模式:
POSTING: 默认线程模式,在哪个线程发送事件就在哪个线程处理事件
MAIN: 在主线程中处理事件,如果在主线程中发送事件,则直接在主线程通过反射处理事件,如果是在子
线程中发送事件,则将事件入队列,通过Handler 切换到主线程执行处理事件。
MAIN_ORDERED:无论在哪个线程中发送事件,都将事件入队列,然后通过handler 切换到主线程,依次
处理事件。
BACKGROUND:如果在主线发送事件,则先将事件入队列,然后通过线程池依次处理事件。如果在子线程
中发送事件,则直接在发送事件的线程通过反射处理事件。
ASYNC:无论在哪个线程发送事件,都将事件入队列,然后通过线程池进行处理。
EventBus功能:
主要用于组件间的通讯,优点是:组件间最大化解耦。
EventBus使用流程:
添加依赖:
①添加依赖:
compile 'org.greenrobot:eventbus:3.1.1'
接收消息页面:
②其实注册订阅模式,只有先注册,才能接受到消息,注册的方式是:
EventBus.getDefault().register(this);
③解除注册:
EventBus.getDefault().unregister(this);
④接收的订阅者是用注解@Subscribe进行标注,参数就是我们订阅的消息体。代码如下:
@Subscribe(threadMode = ThreadMode.POSTING, priority = 4)
public void onEvent(MyTestMessager myTestMessager) {
Toast.makeText(this, myTestMessager.getMessager(), Toast.LENGTH_SHORT).show();
Log.e("aaa", "EventTest: " + myTestMessager.getMessager());
tv_test.setText(myTestMessager.getMessager());
}
这里可以设置EventBus工作的线程模式 和设置线程的优先级别
发送消息,在发送页面:
①普通发送:
EventBus.getDefault().post(new MyTestMessager("启动新界面传递的值"));
MyTestMessager: 是自定义的Bean类,更具自己需要随意定义,可以定义一下自己逻辑需要的属性,在发
送之前给bean类设置好,在消息处理处,可以通过这些属性做相应逻辑处理。
②粘性发送:
.....
小方案:
当我们从A activity 启动B activity ,并用EventBus进行传值时候是不能成功的,原因是b还没有注册,在a中进行post传值,b中是接受不到消息的。
解决的办法是:在a中的onStop方法中进行传递数据。因为启动界面创建后才会调用onStop方法。
网友评论