這個只是自己記錄的自己看的,語法上不太嚴謹,邏輯還是清楚的
回調(基礎版):
A類裏的AA函數不會做某事,就利用自己裏面的CC函數調用B類裏的BB函數做這件事,BB的參數裏面有A類參數,BB把自己的步驟執行完畢後,再調用AA執行後面的操作(就是回調,回頭再調)。A(不會做)---調用B的BB方法---傳入必要的參數,和自己本身----B.BB()被調用,協助A完成操作----再調用A的方法---表面上看上去是A操作的
A{
AA(x,y){}
CC(){
A=new A();
B=new B();
//在此處對x,y進行操作,因爲A不會才委託給B的
B.BB(x,y,A);
}
}
B{
BB(x,y,A){
.....
//此處執行A類不會的東西,比如對x,y的處理
A(x,y){}//回調
}
}
回調(高級版):
把對象作爲參數傳進去,完全暴露,而且不安全
再次升級(匿名內部類):
B 直接調用 A的匿名內部類,直接把A的存在隱藏掉,因爲A就是new出來的匿名類,程序的關鍵功能都是B來實現的,回調A的方法也是在B內實現的,所以不需要建立一箇中間對象,代碼更潔淨,(邏輯更奇怪)
B不用關心A是什麼類?直接按照已經寫好的邏輯執行,只要A實現了相關的接口
《《《《《《《《《《《《《《《《《《《《《《《《《《《《《《《《《《《《《《《《《《《《《《《《《《《《
public class RoomMate {
// 這裏可以加線程,如果有其他的動作可以讓他先執行,這樣就避免了卡死現象,所以在 前臺調接口 裏面用的比較多
public void getAnswer(String homework, DoHomeWork someone)
{
if("1+1=?".equals(homework)){
someone.doHomeWork(homework, "2");
}else{
someone.doHomeWork(homework, "(空白)");
}
}
public static void main(String[] args) {
RoomMate roomMate = new RoomMate();
roomMate.getAnswer("1+1=?", new DoHomeWork() {
@Override
public void doHomeWork(String question, String answer){
//此處可以加上耗時操作
System.out.println("問題:"+question+" 答案:"+answer);
}
});
}
}
》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》
下面的調用匿名內部類,然後回調其中的方法
onsuccess , onfailure方法就相當於重寫,實際實現了業務邏輯
new EPlusHelper().getDoctorContact(0, new JsonHttpResponseHandler() {
@Override
public void onSuccess(int statusCode, Header[] headers,
org.json.JSONObject response) {
Log.e("TAG", response.toString());
UserListModel model = JSON.parseObject(response.toString(),
UserListModel.class);
if (model.ok()) {
int conNum=model.getFeedback().getContacts().size();
tvConNum.setText(conNum+"人");
Log.e("tag", model.getFeedback().getContacts().toString());
} else {
// JSToastUitl.toast("網絡異常");
}
};
@Override
public void onFailure(int statusCode, Header[] headers,
Throwable throwable, org.json.JSONObject errorResponse) {
// TODO Auto-generated method stub
super.onFailure(statusCode, headers, throwable, errorResponse);
JSToastUitl.toast("網絡異常");
}
});
》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》
AsyncHttpResponseHandler 接收請求結果,一般重寫onSuccess及onFailure接收請求成功或失敗的消息,還有onStart,onFinish等消息。
下面的即是helper的實際操作,先操作param,然後asyncHttpClient.post這一句裏面實現了onsuccess和onfailure方法的邏輯
此處按理說應該是 responseHandler.onSuccess,onFailure(params)方法,爲什麼要用 asyncHttpClient.post,這一步之後執行的是
this.threadPool.submit(new AsyncHttpRequest(paramDefaultHttpClient, paramHttpContext, paramHttpUriRequest, paramAsyncHttpResponseHandler));
發送到線程池
AsyncHttpRequest 繼承自Runnabler,被submit至線程池執行網絡請求併發送start,success等消息,雖然沒看到源碼,但是這個的success裏面肯定寫的是responseHandler.onSuccess方法
public void getDoctorContact(int type,JsonHttpResponseHandler responseHandler) {
JSONObject params = new JSONObject();
params.put("doctorId", PrefsUtil.getCustomerId());
params.put("type", type);
String url = BASE_URL + "doctor/contacts";
try {
asyncHttpClient.post(context, url, setEntity(params), null, responseHandler);
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
JSToastUitl.toast("網絡異常");
}
}
基本上所有的匿名內部類都是是回調,所有的異步回調都有線程....感覺分析的沒什麼屌用誒