首先列举一下Fragment中可以实现通信的技术:
万金油 eventBus rxBus:
优点:方便,快捷,简单
缺陷:
1.反射,性能打折,效率低
2.代码维护困难
3.数据无法返回,单向传送
handler
缺点:
1.耦合
2.无法获取activity的返回结果
3.内存泄漏
static
静态变量,内存消耗
广播
缺陷:
1.性能差,延迟
2.通信体系,较重,一个发生,多个接受
3.传播的数据有限
4.代码冗余
接口(最优方案)
简单、效率高,方便,解耦合
缺点:
代码冗余,每个需要通信的fragment,都需要定义自己独一无二的接口。
那最合适的通信方法,可以写一个万能接口,共用。
下面把代码贴出来:
首先先定义一个基类
/** * 万能接口之-----基类 */ public class Function { //方法名字 public String functionName; //传递方法名字 public Function(String functionName){ this.functionName = functionName; } }
其次方法类
/** * 万能接口之-----有参数,无返回值的方法(这里我只实现了一个方法类型) */ public abstract class FunctionHasParamNoResult<P> extends Function { public FunctionHasParamNoResult(String functionName) { super(functionName); } public abstract void function(P p); }
最后是管理类
/** * 万能接口之-----接口管理类 */ public class FunctionManager { private static FunctionManager instance; /** * 容器,用来存储方法名字 key 对应的方法名 value 对应的是 参数返回对象 */ //这里只实现了一种容器 就是有参数,无返回。故只有一种容器 private Map<String, FunctionHasParamNoResult> mNasparamNoResultMap; /** * 构造方法 */ private FunctionManager() { mNasparamNoResultMap = new HashMap<>(); } public static FunctionManager getInstance() { if (instance == null) { instance = new FunctionManager(); } return instance; } /*** * 添加有参数无返回值的方法 * @param function */ public void addFunction(FunctionHasParamNoResult function) { mNasparamNoResultMap.put(function.functionName, function); } /*** * 调用有参数无返回值的方法 * @param functionName * @param p * @param <P> */ public <P> void invokeFunction(String functionName, P p) { //判断方法名是否为空,若为空跳出此方法 if (TextUtils.isEmpty(functionName)) { return; } //判断 (有参数无返回值)的容器是否为空 if (mNasparamNoResultMap != null) { //根据方法名查询容器中对应的数据 FunctionHasParamNoResult f = mNasparamNoResultMap.get(functionName); if (f != null) { //调用回调传值 f.function(p); } else { try { throw new Exception("方法不存在"); } catch (Exception e) { e.printStackTrace(); } } } } }
调用:(A->B:key对应方法名,valule对应传递的值)
A:FunctionManager.getInstance().invokeFunction("key","vaule");
B:FunctionManager.getInstance().addFunction(new FunctionHasParamNoResult("key") { @Override public void function(Object o) { Log.e("arguments", "万能的接口:"+o.toString()); } });