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


概述


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)

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注册一个广播地址:


<receiver android:name=".MyReceiver">  
            <intent-filter>  
                "android.intent.action.MY_BROADCAST"/>  
                "android.intent.category.DEFAULT" />  
              
        
配置了以上信息之后,只要是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使用)