最开始学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了,主页空空的,所以索性直接贴了过来...)