前言:
现在要想实现控件之间的通信,各个组件之间的通讯 已经不是一件难事。我们可以通过handler,广播,intent,接口方式来实现通讯。现在我们的难题就是来如何选择一种通信方式来实现,接下来我是想来讲一下 EventBus 的简单使用方式。
步骤
- 引用
- 发布方
- 完成信息载体
- 订阅方
- 区分接收某一个我们想要的信息
- 四种线程模型
引用
compile 'de.greenrobot:eventbus:3.0.0-beta1'
发布方
EventBus.getDefault().postSticky(new Message(temp));
信息载体
public class Message {
public String name;
public Message(String aName) {
this.name = aName;
}
}
订阅方
1、注册 2、接收
注册
EventBus.getDefault().register(this);
接收
@Subscribe(threadMode = ThreadMode.MainThread,sticky = true )
public void onEventMainThread(Message message) {
Log.e("message~~~" ,""+ message.name);
Toast.makeText(this, message.name, Toast.LENGTH_SHORT).show();
demo.setText(message.name);
EventBus.getDefault().unregister(this);
}
区分接收某一个我们想要的信息
案例(收到的信息为temp1)
发送
EventBus.getDefault().postSticky(new Message(temp));
EventBus.getDefault().postSticky(new Mess(temp1));
接收
@Subscribe(threadMode = ThreadMode.MainThread,sticky = true )
public void onEventMainThread(Mess message) {
Log.e("message~~~" ,""+ message.demo);
Toast.makeText(this, message.demo, Toast.LENGTH_SHORT).show();
demo.setText(message.demo);
EventBus.getDefault().unregister(this);
}
四种线程模型
EventBus3.0有四种线程模型,分别是:
- POSTING (默认) 表示事件处理函数的线程跟发布事件的线程在同一个线程。
- MAIN 表示事件处理函数的线程在主线程(UI)线程,因此在这里不能进行耗时操作。
- BACKGROUND 表示事件处理函数的线程在后台线程,因此不能进行UI操作。如果发布事件的线程是主线程(UI线程),那么事件处理函数将会开启一个后台线程,如果果发布事件的线程是在后台线程,那么事件处理函数就使用该线程。
- ASYNC 表示无论事件发布的线程是哪一个,事件处理函数始终会新建一个子线程运行,同样不能进行UI操作。
Thanks