1. 程式人生 > >android進階3step1:Android元件通訊——事件框架匯流排Otto

android進階3step1:Android元件通訊——事件框架匯流排Otto

事件框架匯流排Otto

一、Otto是什麼?

Otto是基於Guava專案的Android系統的一個EventBus模式類庫,如果你在Android程式開發的過程中想要不同的元件之間進行有效的通訊可以使用這個庫。通過Otto庫可以降低程式之間的耦合性。

二、Otto 解決了哪些問題?


1、用來簡化應用程式元件之間的通訊,例如複雜的介面跳轉 ActivityA 跳轉到 ActivityB,ActivityB 跳轉到 ActivityC,此時需要從 ActivityC 中獲取到使用者的操作資料返回到ActivityA 和 ActivityB 中顯示,或者在 Activity 中有多個 Fragment,其中一個Fragment 裡的資料變化需要同步更新其它 Fragment 的資料變化,這時候如果使用Interface 的方式進行它們之間的互動則比較複雜,耦合度也高。

2、簡化了程式,使程式碼變得更加優美

三、Otto 如何使用?

Otto 採用註解定義訂閱/釋出者角色的方式:

  • @Subscribe:標明其為訂閱者。通過此註解來告訴 Bus 匯流排,該方法訂閱了一個事件, 同時 Bus 匯流排可以通過此註解來找到需要呼叫的方法;
  • @Produce:標明其為釋出者;
  • register()方法:通過 Bus 類的此方法來實現某個類的註冊,這樣 Bus 匯流排便可以通過此 方法來查詢註冊的類;
  • unregister()方法:通過此方法實現從 Bus 事件匯流排中登出。

四、使用示例:

這裡假設某個 Activity 釋出訊息資料給其 Fragment,具體使用步驟如下:

1)新增依賴

dependencies {

......
/ /Otto 所需要依賴的包
implementation 'com.squareup:otto:1.3.8'

}

2) 建立自定義 Bus 類
//使用單例模式建立 MyBus 類方便後面使用

public class MyBus extends Bus {

private static MyBus bus;
public static MyBus getInstance() {

if (bus == null) {
bus = new MyBus();

}

return bus; }

}


3)建立 TransferData 類作為元件間通訊傳遞資料的載體

public class TransferData {

public String content;

public TransferData(String content) { 
this.content = content;
}

public String getContent() { 
return content;
}

public void setContent(String content) { 
this.content = content;
} 
}

4)在接收資料端 Fragment 裡

@Override
public void onStart() {

super.onStart();
//使用 Bus 類的 register()方法註冊到 bus 事件匯流排中

MyBus.getInstance().register(this);

}

//定義訂閱者並接收來自 Activity 中的訊息,引數型別為 3)中定義的型別

@Subscribe

public void setContent(TransferData data) {

 System.out.println(data.getContent());

}

//接收到資料的變化
@Subscribe
public void onMyScrollChange(ScrollEventData data) {

System.out.println(data); }

@Subscribe
public void onDataChange(String str) {

System.out.println(str); }

@Override
public void onStop() {

super.onStop();
//從 Bus 事件匯流排中登出

MyBus.getInstance().unregister(this);

}

5) 在釋出資料 Activity 端,通過 Bus 將 TransferData 型別的資料釋出到Fragment
 

@Override
protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

MyBus.getBusInstance().register(this); }

//註明釋出者
@Produce
public TransferData produceFragmentData() {

return new TransferData("The data comes from activity"); }

//通知所有@Subscribe 匹配 TransferData 型別引數的方法執行
public void postDataToFragment(){

MyBus.getInstance().post(produceFragmentData()); }

@Override
public void onDestroy() {

super.onStop();
//從 Bus 事件匯流排中登出MyBus.getInstance().unregister(this);

}

五、總結:

Otto 是針對事件提供統一訂閱和釋出以達到元件間通訊的解決方案。

作用就是簡化 android 應用內元件的通訊。

使用時需要注意如下兩點:

  • 1)被@Subscribe,@Produce 註解的方法必須定義在直接的作用類上,而不能定義在 基類。
  • 2)釋出者和訂閱者都需要 register()和 unregister()。

推薦 Otto 官方網站:
http://square.github.io/otto/