一、什么是事件总线?
它是针对Android中的四大组件Activity,Service,BroadcastReceiver和ContentProvider之间实现的统一的订阅、发布,以实现它们之间的进程通信。其原理是采用了观察者模式的开发机制。
二、常用的事件总线框架
EventBus和Otto
EventBus的基本使用官方参考:https://github.com/greenrobot/EventBus
Otto的基本使用官方参考:http://square.github.io/otto/
三、EventBus的使用
1.在build.gradle中添加依赖库
dependencies {
compile fileTree(include: ['*.jar'], dir: 'libs')
testCompile 'junit:junit:4.12'
compile 'org.greenrobot:eventbus:3.0.0'
}
2.注册和反注册
一般在Activity或者Fragment中的onCreat方法中进行注册,在onDestroy中进行反注册。
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
EventBus.getDefault().register(this);
}
@Override
protected void onDestroy() {
super.onDestroy();
EventBus.getDefault().unregister(this);
}
3.订阅者
类似广播,但是有别于2.4版本,你不必再去约定OnEvent方法开头了(看不懂没关系),在3.0版本之后订阅者有四种形式(就是四种线程模式)的接收方式:
ThreadMode.MAIN:如果线程模式是MAIN,那么无论事件是在什么线程发送出来的,该事件处理函数都会在UI线程中执行,可以用来更新UI,但是注意不要做耗时操作。
ThreadMode.POSTING:如果订阅者在使用事件处理函数时候指定了这种线程模式,那么该事件是在哪个线程发布出来的,那么处理函数就会在这个线程中执行,也就是说发布事件和接收事件是在同一个线程。在这种线程模式下尽量避免做耗时操作,因为会阻塞事件的传递,很有可能引起ANR。
ThreadMode.ASYNC:这种线程模式就是说,无论事件在哪个线程发布,该事件的处理函数都会在新建的子线程中执行,此事件处理函数中是不能进行UI操作的。
ThreadMode.BACKGROUND:这种线程模式意思是,如果事件是在UI线程中发布出来的,那么该事件处理函数就会在子线程中执行;如果事件是在子线程中发布的,那就还在这个线程中处理。在这种模式下是不能更新UI操作的。
个人觉得第一种比较常用,后面三种用的频率很低。
@Subscribe(threadMode = ThreadMode.MAIN)
public void receiveEventBus(MessageEvent event) {
Log.v(TAG, "EventBus is running" + event.getMessage());
//在此执行你要进行的操作(更新UI,接收消息等)
}
使用了@Subscribe注解,其含义为订阅者,在其内传入了threadMode,我们定义为ThreadMode.MainThread, 其含义为该方法在UI线程完成,这样你就不要担心抛出异常啦。receiveEventBus 是一个函数名,你自己可 以任意定义。
4.发布者
发布者可以在你程序的任意位置进行发布,当它执行之后,订阅者回立即收到消息,并进行处理。
EventBus.getDefault().post(new MessageEvent ());或者EventBus.getDefault().post(new MessageEvent (msg));
由于我们的post可能是一个对象,所以我们需要定义一个class类MessageEvent.java
public class MessageEvent {
private String msg;
public PersonEvent() {
}
public PersonEvent(String msg) {
msg = msg;
}
public String getMsg() {
return msg;
}
public void setMsg(String msg) {
this.msg = msg;
}
}
好了,到这里EventBus事件总线就完成了,赶快去尝试一下能否正常运行吧!
如果您觉得对你有用,请帮我顶一顶。