Fragment通信详解
概述
Activity与Fragment之间是存在依赖关系的,因此它们之间必然会涉及到通信问题,解决通信问题必然会涉及到对象之间的引用。因为Fragment的出现有一个重要的使命就是:模块化,从而提高复用性。若达到此效果,Fragment必须做到高内聚,低耦合。
它们之间通信的方案有:handler,广播,EvnetBus,接口等
Activity到Fragment通信方案
1. Handler方案
// Activity代码
public class MainActivity extends FragmentActivity {
//声明一个Handler
public Handler mHandler = new Handler() {
@Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
//省略处理代码…
}
//省略处理代码…
}
// Fragment代码
public class MainFragment extends Fragment {
//保存Activity传递的handler
private Handler mHandler;
@Override
public void onAttach(Activity activity) {
super.onAttach(activity); //耦合
if (activity instance MainActivity){
mHandler = ((MainActivity) activity).mHandler;
}
}
//省略处理代码…
}
缺点:
- Fragment对具体的Activity存在耦合,不利于Fragment复用
- 不利于维护,若想删除相应的Activity,Fragment也得改动
- 没法获取Activity的返回数据
2. 广播方案
缺点:
- 广播的意图是用在一对多,接收广播者是未知的情况
- 广播性能较差
- 传播数据有限制,必须得实现序列化接口
3. 接口方案
public class MainActivity extends FragmentActivity implements FragmentListener {
@override
public void activityInterface() {
//...接口实现代码省略
}
}
public class MainFragment extends Fragment {
public FragmentListener mListener;
//MainFragment开放的接口
public static interface FragmentListener { //调用接口
void activityInterface();
}
@Override
public void onAttach(Activity activity) {
super.onAttach(activity);
//对传递进来的Activity进行接口转换
if (activity instance FragmentListener){
mListener = ((FragmentListener) activity);
}
}
}
缺点:
- 假如项目很大了,Activity与Fragment的数量也会增加
- 为每对Activity与Fragment定义交互接口非常麻烦
4. Bundle方案
在Activity中创建Bundle数据包,并调用Fragment的setArguments(Bundle bundle)方法
缺点:
- 传播数据有限制,必须得实现序列化接口
- 没法获取Activity的返回数据
Fragment到Activity通信方案
1. EventBus方案
//Activity部分代码
@Override
protected void onResume() {
super.onResume();
EventBus.getDefault().register(this);//注册
}
@Override
protected void onPause() {
super.onPause();
EventBus.getDefault().unregister(this);//注销
}
@Subscribe(threadMode = ThreadMode.MAIN)
public void onEvent(EventMessage message) {
//省略处理代码…
}
//Fragment部分代码
EventBus.getDefault().post(message);
缺点:
- EventBus是用反射机制实现的,性能上会有问题
- EventBus难于维护代码
- 没法获取Activity的返回数据
2. 广播方案
缺点:
- 广播的意图是用在一对多,接收广播者是未知的情况
- 广播性能较差
- 传播数据有限制,必须得实现序列化接口
3. 接口方案
Activity可以通过调用FragmentManager的findFragmentById()或findFragmentByTag()方法获取对应的Fragment,从而调用接口。
缺点:
- 假如项目很大了,Activity与Fragment的数量也会增加
- 为每对Activity与Fragment定义交互接口非常麻烦
更新:2018/05/16