匿名內部類,異步回調淺析

這個只是自己記錄的自己看的,語法上不太嚴謹,邏輯還是清楚的

回調(基礎版):

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("網絡異常");
        }
    }



基本上所有的匿名內部類都是是回調,所有的異步回調都有線程....感覺分析的沒什麼屌用誒




發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章