EventBus使用详解及组件之间通信



概述


EventBus是一个Android端优化的publish/subscribe消息事件总线,简化了应用程序内各组件间、组件与后台线程间的通信。


如何使用(eg:A activity 向 B activity传递信息)


1.定义一个消息类Mesage该类是一个JavaBean对象.
eg:

消息类
p

public class Mesage { privateString 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)


Post Event
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)。

(1).startActivityForResult使用:

A activity

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);


(2).BroadcastReceiver使用实例:
A activity
public class MessageBroadcastReceiver extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { mTextView.setText("------>:" + intent.getStringExtra("message")); } }静态注册:静态注册是在AndroidManifest.xml文件中配置的,我们就来为MyReceiver注册一个广播地址:

"android.intent.action.MY_BROADCAST"/>

配置了以上信息之后,只要是android.intent.action.MY_BROADCAST这个地址的广播,MyReceiver都能够接收的到。注意,这种方式的注册是常驻型的,也就是说当应用关闭后,如果有广播信息传来,MyReceiver也会被系统调用而自动运行

动态注册:动态注册需要在代码中动态的指定广播地址并注册,通常我们是在Activity或Service注册一个广播,下面我们就来看一下注册的代码:

MyReceiver receiver = new MyReceiver(); IntentFilter filter = new IntentFilter(); filter.addAction("android.intent.action.MY_BROADCAST"); registerReceiver(receiver, filter);


执行这样行代码就可以解决问题了。注意,这种注册方式与静态注册相反,不是常驻型的,也就是说广播会跟随程序的生命周期。
我们可以根据以上任意一种方法完成注册,当注册完成之后,这个接收者就可以正常工作了。我们可以用以下方式向其发送一条广播:



Intent intent = new Intent("android.intent.action.MY_BROADCAST"); intent.putExtra("msg", "hello receiver."); sendBroadcast(intent);






通过以上代码对比,这没什么区别嘛!说好的简洁呢?现在我将需求稍微改一下,A activity收到消息后,需要从网络服务器获取数据并将数据展示出来。如果使用广播,ActivityA中广播接收器代码应该这么写:

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(); }



EventBus

@Subscribe(threadMode = ThreadMode.BackgroundThread) public void onGetDataEvent(MessageEvent messageEvent) { //从服务器上获取数据 ...... EventBus.getDefault().post(new Message()); }@Subscribe(threadMode = ThreadMode.MainThread) public void onShowDataEvent(ShowMessageEvent showMessageEvent) { //将获取的数据展示在界面上 ...... }

通过以上这个例子对比,我们很容易发现EventBus的优势,代码简洁,层次清晰等。但是EventBus也有一个小小的缺点JavaBean会随着消息的增多而增加。


EventBusEventBus框架分析与实现





【EventBus使用详解及组件之间通信】

    推荐阅读