模板性代碼:
-
private MyListener myListener;
-
-
public
interface MyListener {
-
//通過抽象方法的參數傳遞數據的
-
void getData(Response res);
-
}
-
-
//回調方法
-
public void setOnListener(MyListener myListener) {
-
this.myListener = myListener;
-
}
通過接口引用為抽象方法賦值
myListener.getData(Response res);
在另一個類中的某個方法中getNetData()進行回調網絡請求結果
-
CarGoodsFragment carGoodsFragment = CarGoodsFragment.getInstance(
"陳如水",
22);
-
carGoodsFragment.setOnListener(
this);
流程是:
1)定義接口: 定義一個接口、定義其中的抽象方法、抽象方法含有參數(被傳遞的數據);
2)編寫回調方法: 在定義接口的類中,編寫用戶回調的方法,要傳遞一個接口對象實例,讓別的類去實現。(相當於為接口成員變量賦值)
3)為抽象方法賦值: 獲取一個全局的接口成員變量,在某個事件中使用接口成員變量調用接口中的方法,並且為抽象方法中的參數賦值。(這一步可以在回調方法中實現)
在另一個頁面,在合適的時機,創建此類的實例,調用類中的回調方法,為接口對象賦值this,即可實現回調。
————————————————————————————————————————————————>
用接口回調封裝網絡請求: 模板性代碼
登錄模塊:點擊事件中的方法
-
private void Login() {
-
//獲取用戶輸入的參數
-
String pwd = et_pwd.getText().toString();
-
String login_name_put = et_login_name.getText().toString();
-
-
if (login_name_put ==
null ||
"".equals(login_name_put)) {
-
ToastUtils.showShort(
"請輸入登錄帳號");
-
}
else
if (pwd ==
null ||
"".equals(pwd)) {
-
ToastUtils.showShort(
"請輸入登錄密碼");
-
}
else {
-
HashMap<String, String> paramsMap =
new HashMap<>();
-
//獲取請求參數
-
paramsMap.put(
"login_name", login_name_put);
-
paramsMap.put(
"pwd", pwd);
-
HashMap<String, String> dataMap = ParamsUtils.getParamsMap(paramsMap);
-
-
//調取服務器端接口(網絡請求業務類)
-
LoginManager loginManager =
new LoginManager();
-
loginManager.login(LoginUI.
this, LoginUI.
this, dataMap);
-
}
-
}
實現接口,實現接口中的抽象方法:
-
@Override
-
public void loginSuccess(LoginEntity loginStatus) {
-
ToastUtils.showShort(
"登錄成功");
-
-
//1,是否是第一次登錄app
-
SPUtils.put(LoginUI.
this,
"LOGIN_STATE_FIRST",
"2");
-
//2,存儲獲取到的SID
-
SPUtils.put(LoginUI.
this,
"SID", loginStatus.getSid());
-
//3,存儲用戶ID
-
SPUtils.put(LoginUI.
this,
"USER_ID", loginStatus.getId());
-
//4,保存用戶的登錄狀態
-
SPUtils.put(LoginUI.
this,
"LOGIN_STATE",
true);
-
-
//登錄成功,直接進行頁面跳轉
-
startActivity(
new Intent(LoginUI.
this, MainUI.class));
-
-
finish();
-
}
-
-
@Override
-
public void loginFail(String msg) {
-
loadFail(msg);
-
}
LoginManager里面的業務邏輯
-
public
class LoginManager {
-
-
public static void login(final LoginDataListener loginDataListener, Activity activity, Map<String, String> dataMap) {
-
NetUtils.addRequest(
new GsonRequest<LoginEntity>
-
(
-
Request.Method.POST,
//請求方式
-
Constant.LOGIN,
//請求地址
-
LoginEntity.class,
//返回實體類的封裝
-
dataMap,
//請求參數
-
new Response.Listener<LoginEntity>() {
-
@Override
-
public void onResponse(LoginEntity response) {
-
//在這里要判斷響應碼
-
if (response.isSuccess()) {
-
loginDataListener.loginSuccess(response);
-
}
else {
-
loginDataListener.loginFail(TextUtils.isEmpty(response.getMessage()) ?
"獲取數據失敗" : response.getMessage());
-
}
-
}
-
},
-
new Response.ErrorListener() {
-
@Override
-
public void onErrorResponse(VolleyError error) {
-
LogUtils.i(
"test", error.getMessage());
-
}
-
}
-
), activity);
-
}
-
-
public
interface LoginDataListener {
-
//激活成功后的數據
-
void loginSuccess(LoginEntity loginStatus);
-
void loginFail(String msg);
-
}
-
}
-
RecycleView中的點擊事件的寫法
-
//寫一個接口
-
public
interface MyItemClickListener {
-
public void onItemClick(View view,int postion);
-
}
-
-
//寫一個回調方法
-
private MyItemClickListener mListener;
-
public void setOnItemClickListener(MyItemClickListener listener){
-
this.mItemClickListener = listener;
-
}
-
-
//你想在什么時候觸發此方法進行回調?
-
@Override
-
public void onClick(View v) {
-
if(mListener !=
null){
-
mListener.onItemClick(v,getPosition());
-
}
-
}
DownloadManager:具體的業務邏輯類,
在某一個Activity中,如果要處理下載邏輯,肯定要持有DownloadManager類的引用,創建這個類的對象,才能調用其中的方法;
用接口去規范行為(請求成功和請求失敗這兩種行為)
public interface OnDownloadListener{
//下載監聽
}
在尋皮革項目中,我把所有的接口都寫到業務邏輯類里面了,其實接口是可以單獨抽取出來的。接口和業務邏輯類分開寫。
需要一個接口的實現類:
1)讓當前Activity實現接口,變成接口的實現類;
2)寫一個類去實現接口,實現其中的抽象方法,然后在需要的地方創建一個接口實現類的子類對象
3)直接在當前位置使用匿名對象實現,創建一個接口實例。
回調原理:
接口調用自己的抽象方法,相當於接口的實現類調用實現類中重寫的抽象方法;
接口中沒有構造函數:
1)接口中是沒有構造函數的,不能直接創建對象,只能由實現類創建對象;接口中的成員常量不需要進行初始化,所以不需要構造函數。
2)而抽象類是有構造方法的,為了給子類調用初始化抽象類中的成員變量。
接口的特點:
1)接口用關鍵字interface表示;類實現接口用implements表示。
2)接口不能實例化:那么,接口如何實例化呢?按照多態的方式,由具體的子類實例化。其實這也是多態的一種,接口多態。
3)接口的子類:要么是抽象類,要么重寫接口中的所有抽象方法。
接口中的成員:
成員變量:只能是常量 默認修飾符 public static final(不能被修改)
構造方法:沒有,因為接口主要是擴展功能的,而沒有具體存在
成員方法:只能是抽象方法 默認修飾符 public abstract(可以省略)
類與類,類與接口以及接口與接口的關系:
類與類: 繼承關系,只能單繼承,但是可以多層繼承
類與接口:實現關系,可以多實現,還可以在繼承一個類的同時實現多個接口。
接口與接口:繼承關系,可以單繼承,也可以多繼承。
定義一個接口:里面只放url的好處是?2不能被修改,直接類名點方法名調用。
接口用來解耦的,盡量不要在activity寫太多的業務邏輯。
接口回調是指:可以把使用某一接口的類創建的對象的引用賦給該接口聲明的接口變量,那么該接口變量就可以調用被類實現的接口的方法。實際上,當接口變量調用被類實現的接口中的方法時,就是通知相應的對象調用接口的方法,這一過程稱為對象功能的接口回調。看下面示例。
```java interface People{ void peopleList(); } class Student implements People{ public void peopleList(){ System.out.println("I’m a student."); } } class Teacher implements People{ public void peopleList(){ System.out.println("I’m a teacher."); } } public class Example{ public static void main(String args[]){ People a; //聲明接口變量 a=new Student(); //實例化,接口變量中存放對象的引用 a.peopleList(); //接口回調 a=new Teacher(); //實例化,接口變量中存放對象的引用 a.peopleList(); //接口回調 } } 結果: I’m a student. I’m a teacher. ```