1. 程式人生 > >藉助事件匯流排框架(EventBus)實現Fragment與Activity通訊

藉助事件匯流排框架(EventBus)實現Fragment與Activity通訊

最開始學Android的時候,Fragment與Activity之間的通訊一直是比較讓人頭疼的部分。

所謂通訊,其實就是要讓Activity裡的某些成員資訊與Fragment共享(或者相反)。一個方法是藉助回撥介面,Fragment裡定義一個介面由Activity實現,Fragment裡獲取Activity例項後強制轉化為介面型別,再在需要的時候回撥介面,完成通訊。這麼說比較抽象,以下是示例:

AFragment:

//定義一個介面

?

1

2

3

public interface Callback{

   

void onUpdateUI();

}

BActivity實現介面:

?

1

2

3

4

5

6

7

8

9

public class BActivity extends Activity implements BFragment.Callback{

 

    //省略程式碼

 

    @Override

    public void onCommunicate() {

        

//實現通訊的內容

    }

}

在Fragment裡回撥介面,實現通訊:

?

1

2

Callback callback = (Callback) getActivity();

callback.onCommunicate();

這樣就完成了一次通訊。除了介面的方法,也可以通過廣播來實現相同的效果,這裡就不再闡述。

但是這些方法都有一個問題,既複雜,又會增大Activity與Fragment之間的耦合性。

為了解決這個問題,就出現了事件匯流排框架。這樣的框架有很多,這裡只講一下EventBus。

事件匯流排基於觀察者模式,如果瞭解這種設計模式會更好理解EventBus的使用。

在gradle裡新增依賴:

?

1

compile 'org.greenrobot:eventbus:3.0.0'

使用時,首先定義一個事件型別。這個事件就是之後要在各個介面進行通訊的載體:

?

1

2

3

4

5

6

7

8

9

10

11

public class MyEvent {

    private String msg;

 

    public String getMsg() {

        return msg;

     }

 

    public void setMsg(String msg) {

        this.msg = msg;

    }

}

接著在介面裡註冊訂閱者:

?

1

EventBus.getDefault().register(this);

在介面裡新增訂閱事件的動作:

?

1

2

3

4

@Subscribe(threadMode = ThreadMode.MAIN) //這裡用註解規定在主執行緒執行操作

public void onMyEvent(MyEvent event) {

    //操作event

}

最後是釋出事件,事件釋出後,所有訂閱者都會接收到這個事件(執行之前新增的訂閱動作):

?

1

2

3

MyEvent event = new MyEvent();

//...設定event

EventBus.getDefault().post(event);

藉助這種方法,只要在Activity/Fragment裡註冊了訂閱者並新增訂閱動作,就能通過在別處釋出事件來形成通訊了。這樣做降低了Activity/Fragment之間的耦合性。

解決方法:

按照cased by中提示,method改為public 並新增@Subscribe

 

 
  1. @Subscribe

  2. public void onEvent(MyEvent event) {

  3. *******

  4. }