首先我们来说下事件总线,它的作用:为了更简化并更高质量的在Activity,Fragment,Thread和Service等之间的通信,解决组件之间高耦合的同时仍能进行高效的通信。
EventBus 是一款针对Android优化的发布-订阅事件总线,简化了应用程序中的各个组件与后台线程间的通信。
其优点是开销小,代码更优雅,将发送者和接收者解耦。
(1) 自定义一个事件类
public class MessageEvent{
...
}
(2)在需要订阅该事件的地方注册事件
EventBus.getDefault().register(this);
(3)发送事件
EventBus.getDefault().post(messageEvent);
(4)处理事件
@Subscribe(threadMode = ThreadMode.MAIN)
public void XXX(MessageEvent messageEvent){
...
}
(5)取消注册事件
EventBus.getDefault().unregister(this);
compile 'org.greenrobot:eventbus:3.0.0'
public class MessageEvent {
private String message;
public MessageEvent(String message) {
this.message = message;
}
public String getMessage() {
return message;
}
public void setMessage(String message) {
this.message = message;
}
}
public class MainActivity extends AppCompatActivity {
private TextView tv_message;
private Button btn_subscription, btn_message;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
tv_message = (TextView) findViewById(R.id.tv_message);
tv_message.setText("MainActivity");
btn_subscription = (Button) findViewById(R.id.btn_subscription);
btn_subscription.setText("注册事件");
btn_message = (Button) findViewById(R.id.btn_message);
btn_message.setText("跳转到SecondActivity");
btn_subscription.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
//注册事件
EventBus.getDefault().register(MainActivity.this);
}
});
btn_message.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
startActivity(new Intent(MainActivity.this, SecondActivity.class));
}
});
}
@Override
protected void onDestroy() {
super.onDestroy();
//取消注册事件
EventBus.getDefault().unregister(MainActivity.class);
}
}
在MainActivity中自定义方法来处理事件。
@Subscribe(threadMode = ThreadMode.MAIN)
public void onMoonEvent(MessageEvent messageBean) {
//展示收到的消息
tv_message.setText(messageBean.getMessage());
}
创建SecondActivity发布消息。
public class SecondActivity extends AppCompatActivity {
private TextView tv_message;
private Button btn_message;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_second);
tv_message = (TextView) findViewById(R.id.tv_message);
tv_message.setText("SecondActivity");
btn_message = (Button) findViewById(R.id.btn_message);
btn_message.setText("发送事件");
btn_message.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
EventBus.getDefault().post(new MessageEvent("欢迎学习EventBus"));
finish();
}
});
}
}
运行程序如下,当我们点击MainActivity中的“注册事件”按钮来注册事件,然后点击“跳转到SECONDACTIVITY”按钮,跳转到SecondActivity。接下来我们点击“发送事件”,这时候finishSecondActivity,显示MainActivity,TextView显示“欢迎学习EventBus”。这样MainActivity成功的接收到了SecondActivity中发送的事件。如图:
EventBus黏性事件,就是发送该事件之后再订阅该事件也能收到该事件。修改代码如下:
@Subscribe(threadMode = ThreadMode.POSTING,sticky = true)
public void onMoonStickyEvent(MessageEvent messageEvent){
tv_message.setText(messageEvent.getMessage());
}
在SecondActivity中定义Button发送黏性事件。
btn_subscription.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
EventBus.getDefault().postSticky(new MessageEvent("黏性事件"));
finish();
}
});
现在我们运行程序,在我们的MainActivity中没有点击“注册事件”,直接跳转到SecondActivity中发送黏性事件。这时回到我们的MainActivity界面。
————————————>
接下来我们点击注册事件,你会发现TextView发生改变显示“粘性事件”,这时大功告成。
-keepattributes *Annotation*
-keepclassmembers class ** {
@org.greenrobot.eventbus.Subscribe ;
}
-keep enum org.greenrobot.eventbus.ThreadMode { *; }
# Only required if you use AsyncExecutor
-keepclassmembers class * extends org.greenrobot.eventbus.util.ThrowableFailureEvent {
(java.lang.Throwable);
}
欢迎童鞋们学习EventBus的基本使用。
更多请查看:
EventBus的github地址:https://github.com/greenrobot/EventBus
EventBus官网:http://greenrobot.org/eventbus/