首先列举一下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());
}
});
博客介绍了Fragment中多种通信技术,如eventBus、rxBus、handler、static、广播和接口等,分析了它们各自的优缺点。指出接口是最优方案,但存在代码冗余问题,提出可写一个万能接口共用,并提及了接口实现的基类、方法类、管理类及调用方式。
440

被折叠的 条评论
为什么被折叠?



