借助事件总线框架(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. }

猜你喜欢

转载自blog.csdn.net/u014644594/article/details/84136007