1. 程式人生 > >EventBus使用詳解及元件之間通訊

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>  
                <action android:name="android.intent.action.MY_BROADCAST"/>  
                <category android:name="android.intent.category.DEFAULT" />  
            </intent-filter>  
        </receiver>
配置了以上資訊之後,只要是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會隨著訊息的增多而增加。