概述
什么是EventBus?
EventBus内部角色介绍
配置
实战案例
概述
在之前传统的Android开发中,线程间或者Activity、Service等组件之间传递消息我们比较倾向于Intent、Handler、Broadcast去实现。接下来跟大家探讨一个很好用的Android的发布/订阅事件总线框架EventBus,这个框架在之前的项目中也有使用过,直到今天才决定整理一片文章梳理下该框架,方便自己梳理内容和提供给大家参考。
什么是EventBus?
EventBus是用于Android的发布/订阅事件总线机制的框架,主要功能是替代Intent、Handler、Broadcast在例如Activity、Fragment这样的功能组件之间或者是线程间的消息传递,是一种发布订阅设计模式(Publish/Subsribe),或称作观察者设计模式。EventBus的优点在于代码优雅,消耗更少,并且将发送者与接受者解耦(降低两者之间的依赖程度)。
EventBus内部角色介绍
Event :传递的事件对象
Subscriber :事件的订阅者
Publisher:事件的发布者
ThreadMode :定义EventBus的线程模式
EventBus的大致工作流程是先自定义一个类,定义一个事件(Event)类型。然后在要接收消息的界面(订阅者Subscriber)进行注册。接下来在要发送信息的界面(发布者Publisher)进行信息的发送。消息发出后然后在订阅者的界面进行消息的接收。当所有操作完成之后解除EventBus的注册。
EventBus的四种线程模式
ThreadMode.POSTIONG:表示该方法会在当前发布事件的线程执行,默认的线程模式
ThreadMode.MAIN:表示在UI线程(主线程)中执行。
ThreadMode.BACKGROUND:如果当前线程不是主线程,则在当前线程执行。否则加入后台任务队列,使用线程池调用。
ThreadMode.ASYNC:加入后台任务队列,使用线程池调用。
Subscriber Priorities(优先级)
优先级顾名思义,等级越高越先执行。EventBus可以通过调整priority来设置优先级,用整数来设置,数字的值越大优先级别越高,越优先执行。
配置
方式一:下载jar包导入工程
Jar包下载地址:https://github.com/greenrobot/EventBus/releases
下载好EventBus的jar包后导入项目的libs目录,然后右键add as library
方式二:在build.gradle中添加网络依赖
compile ‘org.greenrobot:eventbus:3.0.0’
实战案例
为了更好的理解EventBus的工作机制,找了一个Demo加上注解,方便理解。
首先自定义一个类,用来定义事件类型:
public class MyEvent {
private String mMsg;
public MyEvent(String msg){
mMsg = msg;
}
public String getMsg(){
return mMsg;
}
}
然后在要接收消息的界面(订阅者Subscriber)进行注册、信息接收:
/**
* 事件的订阅者 Subscriber
*/
public class MainActivity extends Activity {
Button button;
TextView textview;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//在要接收消息的页面进行注册
EventBus.getDefault().register(this);
button = (Button) findViewById(R.id.btn01);
textview = (TextView) findViewById(R.id.tv01);
btn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent(MainActivity.this,
SecondActivity.class);
startActivity(intent);
}
});
}
public void onEventMainThread(FirstEvent event) {
String msg = "onEventMainThread收到了消息:" + event.getMsg();
tv.setText(msg);
Toast.makeText(this, msg , Toast.LENGTH_SHORT).show();
}
@Override
protected void onDestroy() {
super.onDestroy();
//在onDestroy生命周期中解除注册
EventBus.getDefault().unregister(this);
}
}
接下来在要发送信息的界面(发布者Publisher)进行信息的发送:
/**
* 事件发布者 Publisher
*/
public class SecondActivity extends Activity {
private Button btn_SendMsg;
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_second);
btn_SendMsg = (Button) findViewById(R.id.btn_first_event);
btn_SendMsg.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
//发送事件
EventBus.getDefault().post(new FirstEvent("FirstEvent btn clicked"));
}
});
}
}