一、首先要说的自然是我准备了好几秒钟的开场白:
最近看别人的Demo看到一个有趣的框架EventBus,挺有趣,也挺好用。看名称个人理解成事件总线,这个总线负责接收发布者的信息转发给订阅者。
不太会画图,暂且看看我用文字粗略表示的“图”:
订阅者<——EventBus<——发布者
也就是说发布者在某处发布了一些信息,已经订阅了该信息的订阅者即可收到该信息。
EventBus主要用于代替Intent,Handler,Broadcastreceiver在Activity,Service等之间传递消息。使得代码更加优雅,如果利用得好还能很大程度上解耦。
二、下载安装
使用android studio可以直接在gradle写上:
compile 'org.greenrobot:eventbus:3.0.0'
三、基本使用
1.自定义一个类,类似java bean
public class MyMessage{
private String msg;
//get,set...
}
2.发送消息,假设要向某个地方发送一条消息“hello”
(1)获取EventBus的对象
(2) 准备好要发送的消息
EventBus eventBus= EventBus.getDefault();
(2) 准备好要发送的消息
MyMessage mMsg=new MyMessage();
mMsg.setMsg("hello");
eventBus.post(mMsg);
(3)接收消息
3.在要接收消息的地方注册EventBus,同样是使用EventBus对象注册:
eventBus. register(Context context);
注册完成之后在要接收消息的页面写接收方法:
public void onEventMainThread(MyMessage event) {
String msg = "onEventMainThread收到了消息:" + event.getMsg();
Log.d("message", msg);
tv.setText(msg);
Toast.makeText(this, msg, Toast.LENGTH_LONG).show();
}
无论发送线程是否主线程,在该方法执行的时候都是主线程在执行,因此可以放心在该方法执行更新ui操作。但是要注意不能再改方法中进行耗时操作。
四、进阶使用
上面提到在onEventMainThread方法所执行的逻辑都是在主线程中执行的,那么假如我要在子线程中执行又要怎么写呢?
在EventBus中有四个订阅函数:1)onEvent 2)onEventMainThread 3)onEventBackground 4)onEventAsync
onEventBackground:如果消息时间在主线程发布出来的话,那么onEventBackground就会新起一条子线程中运行,如果消息在子线程中发出来的话那么,onEventBackground就会直接在子线程中运行
onEventAsync:与onEventBackground的作用差不多,区别在于无论消息在主线程还是子线程发送,都会新起一条线成执行。
onEvent:如果发送消息所在的线程在主线程那么该方法就会在主线程执行,如果发送消息在子线程那么该方法也会在该子线程执行。