第一次參加工作時使用的網絡框架是AsyncHttpClient,雖說該框架使用非常簡潔,但是使用的過程同時也是初學者成長與思考的過程。在項目的不同階段,重新查閱網絡請求的代碼,總能想到一些優化的方法,或大或小。
github:https://github.com/loopj/android-async-http
官網:http://loopj.com/android-async-http/
使用步驟:
1、創建一個AsyncHttpClient對象
2、創建RequestParams對象並設置請求參數(可選)
3、調用AsyncHttpClient的get或post方法,並傳入AsyncHttpResponseHandler接口的實現對象,用於處理請求返回。一般匿名內部類即可。
使用方法:
compile 'com.loopj.android:android-async-http:1.4.9'
自2015年更新1.4.9版本,支持android6.0移除HttpClient帶來的問題後便沒有後續更新,現在更火的是OkHttp。
關鍵類
AsyncHttpResponseHandler:其餘三個的基類,返回子節數組,實現ResponseHandlerInterface
TextHttpResponseHandler:返回字符串
JsonHttpResponseHandler:返回JSONObject或JSONArray或String
BaseJsonHttpResponseHandler:返回傳入的實體類對象
創建一個AsyncHttpClient對象
AsyncHttpClient asyncHttpClient = newAsyncHttpClient();
AsyncHttpResponseHandler
asyncHttpClient.post(url, new AsyncHttpResponseHandler() { @Override public void onSuccess(int statusCode, Header[] headers, byte[] responseBody) { } @Override public void onFailure(int statusCode, Header[] headers, byte[] responseBody, Throwable error) { } });
通常重寫onSuccess和onFailure分別對應成功、失敗的處理代碼。也可以重寫onStart和onFinish處理啓動和結束的邏輯,一般我用來顯示和隱藏加載對話框
TextHttpResponseHandler
一開始不知道有這麼一個類,每次都手動將byte[]轉String,這個比較常用。
asyncHttpClient.get(url, newTextHttpResponseHandler() { @Override public void onSuccess(int statusCode, Header[] headers, String responseString) { } @Override public void onFailure(int statusCode, Header[] headers, String responseString, Throwable throwable) { } });
JsonHttpResponseHandler
用於直接返回Json對象,這個類相比其他幾個稍微複雜,首先需要你自己選擇重寫的父類方法,其次提供了三種重載的方法供你重寫。
onSuccess/onFailure(...JSONArray)
onSuccess/onFailure(...JSONObject)
onSuccess/onFailure(...String)
查閱源碼可知:JsonHRH會根據不同的解析結果調用不同的onSuccess/onFailure。所以使用這個類,你只需要知道服務器返回的數據格式,並重寫合適的onSuccess/onFailure即可。
asyncHttpClient.get(url, new JsonHttpResponseHandler(){ @Override public void onSuccess(int statusCode, Header[] headers, JSONArray response) { } @Override public void onFailure(int statusCode, Header[] headers, Throwable throwable, JSONArray errorResponse) { } @Override public void onSuccess(int statusCode, Header[] headers, JSONObject response) { } @Override public void onFailure(int statusCode, Header[] headers, Throwable throwable, JSONObject errorResponse) { } @Override public void onSuccess(int statusCode, Header[] headers, String responseString) { } @Override public void onFailure(int statusCode, Header[] headers, String responseString, Throwable throwable) { } @Override public void onRetry(int retryNo) { } });
備註:這裏返回的是 JSONObject或JSONArray對象,對於需要轉換成Java對象的需求來說,這裏還需要自己做一個轉換Java對象的操作。這裏不太方便,不如直接使用BaseJSONHttpResponseHandler。
BaseJsonHttpResponseHandler<JSON_TYPE>
BaseJSONHttpResponseHandler是一個泛型類,類型參數是你要反序列化的JavaBean。也是用於直接返回Json對象,不同於JsonHRH的是你需要重寫parseResponse方法,自己完成Json的反序列化。方便你使用Gson、Jackson Json等第三方框架。
asyncHttpClient.get(url, new BaseJsonHttpResponseHandler<Update>() { @Override public void onSuccess(int statusCode, Header[] headers, String rawJsonResponse, Update response) { } @Override public void onFailure(int statusCode, Header[] headers, Throwable throwable, String rawJsonData, Update errorResponse) { } @Override protected Update parseResponse(String rawJsonData, boolean isFailure) throws Throwable { return Update.parse(rawJsonData);//自己完成反序列化 } });
這裏的Update是一個實體類,自帶一個parse方法能將String反序列化程Update對象。在parseResponse中返回解析完成的Java對象,然後在onSuccess中就可以獲得對應的Java對象。個人認爲比JsonHRH來得好用,這裏將Json轉換Java對象的邏輯放在parseResponse方法裏,代碼邏輯更清晰。
在實戰中進步:
在請求服務器,解析Json數據這條路上經歷了這三個階段:
階段一:只使用AsyncHttpResponseHandler
每次都手動將byte[]轉String,然後新增一個類JsonUtil用於將String轉換成Java對象,代碼非常的臃腫。
階段二:使用TextHttpResponseHandler
省去了byte[]轉String的過程。但是依然需要JsonUtil來轉換Java對象
階段三:使用BaseJsonHttpResponseHandler。
將轉換過程放在每一個JavaBean類中。代碼可以更簡潔易懂。
同樣對於json解析,以前的做法是:
1、新增一個JavaBean
2、在JsonUtil中新增一個getJavaBean()的方法用於反序列化(使用Gson)
由於Gson在使用過程中使用泛型遇到“類型擦除”的問題,找不到解決方法。對於每一個JavaBean都需要新增一個getJavaBean的方法來解析出對應的JavaBean,顯得代碼很臃腫。
解決方法:
方法1、在每一個JavaBean中增加一個parse的方法用於解析Json,解析方法與實體類綁定。
方法2、使用BaseJsonHttpResponseHandler,將解析過程與業務邏輯分離。
在新手階段,對於網絡上推薦的第三方框架,遵循拿來就用的原則,並沒有進行過多的學習。這樣使用效果非常差,對於實現原理的不理解,沒有閱讀過源代碼,使用起來也是流於形式。多多瞭解其實現原理,才能夠得心應手。