藉助事件匯流排框架(EventBus)實現Fragment與Activity通訊
最開始學Android的時候,Fragment與Activity之間的通訊一直是比較讓人頭疼的部分。
所謂通訊,其實就是要讓Activity裡的某些成員資訊與Fragment共享(或者相反)。一個方法是藉助回撥介面,Fragment裡定義一個介面由Activity實現,Fragment裡獲取Activity例項後強制轉化為介面型別,再在需要的時候回撥介面,完成通訊。這麼說比較抽象,以下是示例:
AFragment:
//定義一個介面
1 2 3 |
|
BActivity實現介面:
1 2 3 4 5 6 7 8 9 |
|
在Fragment裡回撥介面,實現通訊:
1 2 |
|
這樣就完成了一次通訊。除了介面的方法,也可以通過廣播來實現相同的效果,這裡就不再闡述。
但是這些方法都有一個問題,既複雜,又會增大Activity與Fragment之間的耦合性。
為了解決這個問題,就出現了事件匯流排框架。這樣的框架有很多,這裡只講一下EventBus。
事件匯流排基於觀察者模式,如果瞭解這種設計模式會更好理解EventBus的使用。
在gradle裡新增依賴:
1 |
|
使用時,首先定義一個事件型別。這個事件就是之後要在各個介面進行通訊的載體:
1 2 3 4 5 6 7 8 9 10 11 |
|
接著在介面裡註冊訂閱者:
1 |
|
在介面裡新增訂閱事件的動作:
1 2 3 4 |
|
最後是釋出事件,事件釋出後,所有訂閱者都會接收到這個事件(執行之前新增的訂閱動作):
1 2 3 |
|
藉助這種方法,只要在Activity/Fragment裡註冊了訂閱者並新增訂閱動作,就能通過在別處釋出事件來形成通訊了。這樣做降低了Activity/Fragment之間的耦合性。
解決方法:
按照cased by中提示,method改為public 並新增@Subscribe
-
@Subscribe
-
public void onEvent(MyEvent event) {
-
*******
-
}