先看效果图
1.什么是接口
接口:一种方法与实现分离的结构化的方法
一种完全解耦的方法,也是实现java语言多继承的方法
2.为什么要在抽象接口
Fragment的通讯
3.为什么使用Fragment
Fragment是在android2.3诞生
优点:
- 1.速度快(出现就是为了解决Activity速度慢)
- 2.方便管理(fragmentManager复用很高)
- 3.耦合度低**
4.Activity与Fragment的通信
1> Handler通讯方式
优点: - 解决问题,实现通信
缺点: - 1.高耦合(持有对象)
- 2.无法从Activity获取到返回值
- 3.内存泄漏
2> 广播方式通信
优点:
- 1.能够解决问题
- 2.耦合度低
缺点: - 1.性能差
- 2.目标不明确
- 3.代码冗余
3> EventBus
优点: - 1.简单
- 2.方便 打哪指哪
缺点: - 1.性能差,大量用到了反射,卡顿
- 2.代码很难维护(不需要知道代码的逻辑 需要自己看底层源码)
- 3.数据只能单向传递
4> 接口
优点: - 1.简单
- 2.效率高
- 3.解耦合
缺点: 如果项目中大量使用接口多得话就不是很好了(命名也会很麻烦)所以需要万能Interface
5.接口抽象
接口的组成:
1.接口名 2.函数(函数名 返回值==>可变 参数==>可变) 3.空的函数体
函数分为4种:- 有参数无返回值
- 有参数有返回值
- 无返回值有参数
- 无参数无返回值
6.代码
1.定义Function
package com.zhang.yu.struct;
/**
* Created by zhang_shuai on 2017/10/18.
* Del:抽取接口中共有部分 函数名
*/
public abstract class Function {
public String mFunctionName;
public Function(String name){
this.mFunctionName = name;
}
}复制代码
2.无参无返回值
package com.zhang.yu.struct;
/**
* Created by zhang_shuai on 2017/10/18.
* Del:无参无返回值
*/
public abstract class FunctionNoParamNoResult extends Function {
public FunctionNoParamNoResult(String name) {
super(name);
}
public abstract void function();//无参无返回值
}复制代码
2.有返回值有参数
package com.zhang.yu.struct;
/**
* Created by zhang_shuai on 2017/10/18.
* Del:有返回值有参数
*/
public abstract class FunctionAndParamNoResult<Param> extends Function {
public FunctionAndParamNoResult(String name) {
super(name);
}
public abstract String function(Param data);
}复制代码
3.无参数有返回值
package com.zhang.yu.struct;
/**
* Created by zhang_shuai on 2017/10/18.
* Del:无参数有返回值
*/
public abstract class FunctionNoParamAndResult<Result> extends Function {
public FunctionNoParamAndResult(String name) {
super(name);
}
public abstract Result function();
}复制代码
4.无参无返回值
package com.zhang.yu.struct;
/**
* Created by zhang_shuai on 2017/10/18.
* Del:无参无返回值
*/
public abstract class FunctionNoParamNoResult extends Function {
public FunctionNoParamNoResult(String name) {
super(name);
}
public abstract void function();//无参无返回值
}复制代码
5.FunctionManager用于管理四中情况
package com.zhang.yu.struct;
import android.text.TextUtils;
import java.util.HashMap;
/**
* Created by zhang_shuai on 2017/10/18.
* Del:管理类
*/
public class FunctionManager {
private static final FunctionManager ourInstance = new FunctionManager();
public static FunctionManager getInstance() {
return ourInstance;
}
private FunctionManager() {
mFunctionNoParamNoResultHashMap = new HashMap<>();
mFunctionNoParamAndResultHashMap = new HashMap<>();
mFunctionAndParamAndResultHashMap = new HashMap<>();
mFunctionAndParamNoResultHashMap = new HashMap<>();
}
//无参数无返回值
private HashMap<String,FunctionNoParamNoResult> mFunctionNoParamNoResultHashMap;
//无参数有返回值
private HashMap<String,FunctionNoParamAndResult> mFunctionNoParamAndResultHashMap;
//有参数有返回值
private HashMap<String,FunctionAndParamAndResult> mFunctionAndParamAndResultHashMap;
//有参数无返回值
private HashMap<String,FunctionAndParamNoResult> mFunctionAndParamNoResultHashMap;
//添加接口
public FunctionManager addFunction(FunctionNoParamNoResult function){
mFunctionNoParamNoResultHashMap.put(function.mFunctionName,function);
return this;
}
//执行接口
public void invokeFunction(String functionName){
if(TextUtils.isEmpty(functionName)){
return;
}
if(mFunctionNoParamNoResultHashMap != null){
FunctionNoParamNoResult f = mFunctionNoParamNoResultHashMap.get(functionName);
if(f != null){
f.function();
}
if(f == null){
try {
throw new FunctionException("NO Function : "+functionName);
} catch (FunctionException e) {
e.printStackTrace();
}
}
}
}
//添加接口
public FunctionManager addFunction(FunctionNoParamAndResult function){
mFunctionNoParamAndResultHashMap.put(function.mFunctionName,function);
return this;
}
//执行接口
public <Result> Result invokeFunction(String functionName,Class<Result> c){
if(TextUtils.isEmpty(functionName)){
return null;
}
if(mFunctionNoParamAndResultHashMap != null){
FunctionNoParamAndResult f = mFunctionNoParamAndResultHashMap.get(functionName);
if(f != null){
if(c!=null){
return c.cast(f.function());
}else{
return (Result) f.function();
}
}
if(f == null){
try {
throw new FunctionException("NO Function : "+functionName);
} catch (FunctionException e) {
e.printStackTrace();
}
}
}
return null;
}
//添加接口
public FunctionManager addFunction(FunctionAndParamNoResult function){
mFunctionAndParamNoResultHashMap.put(function.mFunctionName,function);
return this;
}
//执行接口
public <Param> Param invokeFunction(String functionName,String str){
if(TextUtils.isEmpty(functionName)){
return null;
}
if(mFunctionAndParamNoResultHashMap != null){
FunctionAndParamNoResult f = mFunctionAndParamNoResultHashMap.get(functionName);
if(f != null){
if(str!=null) {
return (Param) f.function(str);
}
}
if(f == null){
try {
throw new FunctionException("NO Function : "+functionName);
} catch (FunctionException e) {
e.printStackTrace();
}
}
}
return null;
}
}复制代码
6.FunctionException自定义异常
package com.zhang.yu.struct;
/**
* Created by zhang_shuai on 2017/10/18.
* Del:
*/
public class FunctionException extends Exception {
public FunctionException(String s){
super(s);
}
}复制代码
7.BaseFragment用于绑定接口
package com.zhang.yu;
import android.content.Context;
import android.support.v4.app.Fragment;
/**
* Created by zhang_shuai on 2017/10/18.
* Del:
*/
public class BaseFragment extends Fragment {
@Override
public void onAttach(Context context) {
super.onAttach(context);
//绑定接口
if(context instanceof MainActivity){
((MainActivity)context).setFunction();
}
}
}复制代码
8.Fragment1
package com.zhang.yu;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import com.zhang.yu.struct.FunctionManager;
/**
* Created by zhang_shuai on 2017/10/18.
* Del:
*/
public class Fragment1 extends BaseFragment {
//定义接口
public static final String INTRFACE = Fragment1.class.getName()+"NPNR";
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.fragment_message, container, false);
view.findViewById(R.id.btn).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
FunctionManager.getInstance().invokeFunction(INTRFACE);//使用接口
}
});
return view;
}
}复制代码
9.MainActivity使用
//创建接口
public void setFunction(){
FunctionManager functionManager = FunctionManager.getInstance();
functionManager.addFunction(new FunctionNoParamNoResult(Fragment1.INTRFACE) {
@Override
public void function() {
Toast.makeText(MainActivity.this,"无参无返回值的接口",Toast.LENGTH_SHORT).show();
}
});
functionManager.addFunction( new FunctionNoParamAndResult<String>(Fragment2.INTRFACE){
@Override
public String function() {
return "我是接口 有返回值 无参的2";
}
});
functionManager.addFunction(new FunctionAndParamNoResult(Fragment3.INTRFACE) {
@Override
public String function(Object data) {
return "我是接口 有返回值 有参的3" +data;
}
});
}复制代码
总结
1.用到this调度
2.主要设计思想
3.一句话定义接口 绑定接口 调用接口