EventBus 是一个 Android 事件发布/订阅框架,通过解耦发布者和订阅者简化 Android 事件传递。传统的事件传递方式包括:Handler、BroadCastReceiver、Interface 回调,相比之下 EventBus 的优点是代码简洁,使用简单,并将事件发布和订阅充分解耦。
事件(Event):又可称为消息。其实就是一个对象,可以是网络请求返回的字符串,也可以是某个开关状态等等。事件类型(EventType)指事件所属的 Class。事件分为一般事件和 Sticky 事件,相对于一般事件,Sticky 事件不同之处在于,当事件发布后,再有订阅者开始订阅该类型事件,依然能收到该类型事件最近一个 Sticky 事件。
订阅者(Subscriber):订阅某种事件类型的对象。当有发布者发布这类事件后,EventBus 会执行订阅者的 onEvent 函数,这个函数叫事件响应函数。订阅者通过 register 接口订阅某个事件类型,unregister 接口退订。订阅者存在优先级,优先级高的订阅者可以取消事件继续向优先级低的订阅者分发,默认所有订阅者优先级都为 0。
发布者(Publisher):发布某事件的对象,通过 post 接口发布事件.
一、流程:
EventBus 负责存储订阅者、事件相关信息,订阅者和发布者都只和 EventBus 关联。
订阅者首先调用 EventBus 的 register 接口订阅某种类型的事件,当发布者通过 post 接口发布该类型的事件时,EventBus 执行调用者的事件响应函数。
二、EventBus 的简单介绍:
1.添加eventbus依赖
compile 'org.greenrobot:eventbus:3.0.0'
2、自定义一个类
public class FirstEvent {
private String msg;
public FirstEvent(String f_msg){
msg=f_msg;
}
public String getMsg(){
return msg;
}
}
public class SecondEvent {
private String msg;
public SecondEvent(String s_msg){
msg=s_msg;
}
public String getMsg(){
return msg;
}
}
3、实战
public class MainActivity extends AppCompatActivity {
private Button btn;
private TextView msg;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
EventBus.getDefault().register(this);//注册
btn= (Button) this.findViewById(R.id.btn1);
msg= (TextView) this.findViewById(R.id.txt1);
btn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
EventBus.getDefault().postSticky(new SecondEvent("Main1向Main2传递数据"));//类似于粘性广播,及
//Main2Activity在oncreate之后会接收来自MainActivity传递的数据。(当然可以用Intent来传递数据)
Intent intent = new Intent(MainActivity.this,Main2Activity.class);
startActivity(intent);
}
});
}
@Subscribe//接收来自MainActivity发送的数据
public void onEventMainThread(FirstEvent event){
String msg1 = "onEventMainThread收到了消息:" + event.getMsg();
Log.d("harvic", msg1);
msg.setText(msg1);
Toast.makeText(this, msg1, Toast.LENGTH_LONG).show();
}
@Override
protected void onDestroy() {
super.onDestroy();
EventBus.getDefault().unregister(this);//反注册EventBus
}
}
public class Main2Activity extends AppCompatActivity {
private Button btn;
private TextView msg;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main2);
btn= (Button) this.findViewById(R.id.btn2);
msg= (TextView) this.findViewById(R.id.txt2);
EventBus.getDefault().register(this);//对于postSticky发送消息,在这里要在所有的空间都初始化之后再注册
btn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
EventBus.getDefault().post(new FirstEvent("Main2向Main1传递数据"));//普通传递
}
});
}
@Subscribe(sticky = true) //(方法可以随便命名)@Subscribe这个注解表示这个接收发送者的消息,具体接收那个根据方法参数的类型,例如在MainActivity里发送者的消息类型是Seconevent,这里就会执行方法的参数是SeconEventd的方法,如果发送者发型的消息类型是ThridEvnet,这里就会执行方法的参数是ThirdEvent的方法。其中这里有个(sticky=true),表明他是粘性event,这样才能对应MainActivity的postSticky。
public void onEventMainThread(SecondEvent event){
String msg1 = "onEventMainThread收到了消息:" + event.getMsg();
Log.d("harvic", msg1);
msg.setText(msg1);
Toast.makeText(this, msg1, Toast.LENGTH_LONG).show();
}
@Override
protected void onDestroy() {
super.onDestroy();
EventBus.getDefault().unregister(this);//反注册EventBus
}
}