EventBus使用詳解及元件之間通訊
阿新 • • 發佈:2019-01-10
概述
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 |
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) {
//將獲取的資料展示在介面上 ......
} |