借助事件总线框架(EventBus)实现Fragment与Activity通信

最开始学Android的时候,Fragment与Activity之间的通信一直是比较让人头疼的部分。

所谓通信,其实就是要让Activity里的某些成员信息与Fragment共享(或者相反)。一个方法是借助回调接口,Fragment里定义一个接口由Activity实现,Fragment里获取Activity实例后强制转化为接口类型,再在需要的时候回调接口,完成通信。这么说比较抽象,以下是示例:

AFragment:

//定义一个接口

public interface Callback{
   void onUpdateUI();
}

BActivity实现接口:

public class BActivity extends Activity implements BFragment.Callback{

    //省略代码

    @Override
    public void onCommunicate() {
        //实现通信的内容
    }
}

在Fragment里回调接口,实现通信:

Callback callback = (Callback) getActivity();
callback.onCommunicate();

这样就完成了一次通信。除了接口的方法,也可以通过广播来实现相同的效果,这里就不再阐述。

但是这些方法都有一个问题,既复杂,又会增大Activity与Fragment之间的耦合性。

为了解决这个问题,就出现了事件总线框架。这样的框架有很多,这里只讲一下EventBus。

事件总线基于观察者模式,如果了解这种设计模式会更好理解EventBus的使用。

在gradle里添加依赖:

compile 'org.greenrobot:eventbus:3.0.0'

使用时,首先定义一个事件类型。这个事件就是之后要在各个界面进行通信的载体:

public class MyEvent {
    private String msg;

    public String getMsg() {
        return msg;
     }

    public void setMsg(String msg) {
        this.msg = msg;
    }
}

接着在界面里注册订阅者:

EventBus.getDefault().register(this);

在界面里添加订阅事件的动作:

    @Subscribe(threadMode = ThreadMode.MAIN) //这里用注解规定在主线程执行操作
    public void onMyEvent(MyEvent event) {
        //操作event
    }

最后是发布事件,事件发布后,所有订阅者都会接收到这个事件(执行之前添加的订阅动作):

MyEvent event = new MyEvent();
//...设置event
EventBus.getDefault().post(event);

借助这种方法,只要在Activity/Fragment里注册了订阅者并添加订阅动作,就能通过在别处发布事件来形成通信了。这样做降低了Activity/Fragment之间的耦合性。

(这篇博客原本是最近写在我的个人博客的,今天开始使用CSDN了,主页空空的,所以索性直接贴了过来...)

你可能感兴趣的:(Android)