概述
EventBus是一个Android端优化的publish/subscribe消息事件总线,简化了应用程序内各组件间、组件与后台线程间的通信。
如何使用(eg:A activity 向 B activity传递信息)
1.定义一个消息类Mesage该类是一个JavaBean对象.
eg:
p public class Mesage { private String msg; public Mesage(String msg) { this.msg = msg; } public String getMsg() { return msg; } public void setMsg(String msg) { this.msg = msg; } } |
2.在需要订阅事件的地方注册事件( B activity)
@Override public void onStart() { super.onStart(); EventBus.getDefault().register(this); } |
3.产生事件,即发送消息(A activity)
EventBus.getDefault().post(new Message("消息")); |
4. 处理消息
@Subscribe(threadMode = ThreadMode.MAIN) public void onMessageEvent(Mesage event) {/* Do something */}; 消息处理thread mode有五种,具体查看thread mode点击打开链接 |
5.取消消息订阅
@Override protected void onDestroy() { super.onDestroy(); EventBus.getDefault().unregister(this); } |
优缺点
采用消息发布/订阅的一个很大的优点就是代码的简洁性,并且能够有效地降低消息发布者和订阅者之间的耦合度。
这里有两个界面,A activity和 B activity,从A activity界面跳转到B activity界面后, B activity要给A activity发送一个消息,A activity收到消息后在界面上显示出来。 这里我们比较常用的方法(startActivityForResult , BroadcastReceiver)。 |
Intent mIntent = new Intent();
mIntent.putExtra("","");
mIntent.setClass(this,B activity.class);
startActivityForResult(mIntent,110);
//接受从B activity回调的消息
@Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { String change01 = data.getStringExtra("change"); // 根据上面发送过去的请求吗来区别 switch (requestCode) { case 0: mTextview.setText(change01); break; default: break; } }
B activity传递消息:
Intent mIntent = new Intent();
mIntent.putExtra("change", "1000");
// 设置结果,并进行传送
this.setResult(resultCode, mIntent); |
public class MessageBroadcastReceiver extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { mTextView.setText("------>:" + intent.getStringExtra("message")); } } 静态注册:静态注册是在AndroidManifest.xml文件中配置的,我们就来为MyReceiver注册一个广播地址:
动态注册:动态注册需要在代码中动态的指定广播地址并注册,通常我们是在Activity或Service注册一个广播,下面我们就来看一下注册的代码:
|
public class MessageBroadcastReceiver extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { new Thread(new Runnable() { @Override public void run() { //从服务器上获取数据 ...... runOnUiThread(new Runnable() { @Override public void run() { // 将获取的数据展示在界面上 ...... } }); } } ).start(); }
@Subscribe(threadMode = ThreadMode.BackgroundThread)
public void onGetDataEvent(MessageEvent messageEvent) {
//从服务器上获取数据 ......
EventBus.getDefault().post(new Message());
}
@Subscribe(threadMode = ThreadMode.MainThread)
public void onShowDataEvent(ShowMessageEvent showMessageEvent) {
//将获取的数据展示在界面上 ......
} |
EventBusEventBus框架分析与实现