先看效果圖
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.一句話定義介面 繫結介面 呼叫介面