EventBus是事件消息总站,实现组件与组件之间的通信
普通事件
1、在需要接收事件或者数据的类中注册
EventBus.getDefault().register(ThirdActivity.this);
2、在需要接收事件或者数据的类中反注册 (在onDestroy)
EventBus.getDefault().unregister(ThirdActivity.this);
3.
构造发送信息类
public static class ClassEvent{
public String data;
ClassEvent( String data){
(String为传递的参数类型,根据自己需求定义)
this.data=data;
};
4.
发布消息
(参数中new 的是自定义的消息类)
EventBus.getDefault().post(new ClassEvent(“某个地方发送过来的数据”));
5.
在需要接收事件或者数据的类中定义方法接收消息
@Subscribe(threadMode = MAIN)
public void EventBus(ClassEvent event){
tv_result.setText(event.jsonData);
}
粘性事件
EventBus 将最新的粘性事件保存在内存中,粘性事件可以被传递给订阅者
1.创建EventBus粘性事件消息类,设置属性:定义的是泛型String类型,(黄色涂抹区域)就只能传递String类型事件 (根据自己传递的消息类型定义泛型)
public class
EventBusStickyMessage {
public
String
Message
;
public
EventBusStickyMessage(
String
message) {
Message
= message; } }
2.
发送黏性事件到接收页面,关键方法postSticky
(new的类就是第一步定义的事件消息类)(此段代码是写在发送消息组件的页面的)
EventBus
.
getDefault
().postSticky(
new
EventBusStickyMessage(
"
xxx
"
));
3.接收黏性事件,在注解里多加了一个属性Sticky,设置为true是启动黏性事件
(此段代码写在接收消息的组件的页面,线程模式有四种,MAIN为UI线程,也就是主线程,-------------接收实际就是注册的一个过程)
@Subscribe
(threadMode = ThreadMode.
MAIN
,sticky =
true
)
public void
ReceviceMessage(A(参数A第一步定义的消息类) a(a为消息类的对象){
//设置控件的内容,通过消息对象的.Message调用
txtShow2
.setText(eventBusStickyMessage.
Message
); }
//
一旦注册了
EventBus
就会接收到消息
if
(
flag
){
//4. EventBus
注册广播
(),
参数是上下文
.
导入的
EventBus
请认准
org.greenrobot //
注意
:
有注册就必须有解注册
(
一般在
OnDestroy
里执行解注册操作
),
防止内存泄漏
,
注册一个界面只能注册一次
,
否则报错
EventBus.
getDefault
().register(
this
);
//
更改标记
,
使其不会再进行注册
,
多次注册会报错
flag
=
false
; }
4.
在
onDestroy
里解除
EventBus
注册
,
//
注意
:
这里比普通的解除注册还多一步
,
就是移除黏性事件
(
是移除所有的还是移除一个
,
看需求
)
@Override
protected void
onDestroy() {
//
移除所有的粘性事件
EventBus.
getDefault
().removeAllStickyEvents();
//
解除注册
EventBus.
getDefault
().unregister(
this
);
super
.onDestroy(); }}
备注:线程的模式
ThreadMode.POSTING:默认使用该模式,表示该方法会在当前发布事件的线程执行
ThreadMode.MAIN:表示会在UI线程中执行
ThreadMode.BACKGROUND:若当前线程非UI线程则在当前线程中执行,否则加入后台任务队列,使用线程池调用
线程池
是一种多
线程
处理形式,处理过程中将任务添加到队列,然后在创建
线程
后自动启动这些任务
ThreadMode.ASYNC:加入后台任务队列,使用线程池调用
普通事件与粘性事件的区别
最大的特点就是添加了粘性事件(sticky),同时使用EventBus粘性事件的步骤和顺序也和普通使用有所不同。