AsyncHttpClient實(shí)戰(zhàn)總結(jié)及思考

第一次參加工作時使用的網(wǎng)絡(luò)框架是AsyncHttpClient,雖說該框架使用非常簡潔,但是使用的過程同時也是初學(xué)者成長與思考的過程。在項目的不同階段,重新查閱網(wǎng)絡(luò)請求的代碼,總能想到一些優(yōu)化的方法,或大或小。

專注于為中小企業(yè)提供成都網(wǎng)站制作、網(wǎng)站建設(shè)服務(wù),電腦端+手機(jī)端+微信端的三站合一,更高效的管理,為中小企業(yè)龍門免費(fèi)做網(wǎng)站提供優(yōu)質(zhì)的服務(wù)。我們立足成都,凝聚了一批互聯(lián)網(wǎng)行業(yè)人才,有力地推動了上千企業(yè)的穩(wěn)健成長,幫助中小企業(yè)通過網(wǎng)站建設(shè)實(shí)現(xiàn)規(guī)模擴(kuò)充和轉(zhuǎn)變。

 

github:https://github.com/loopj/android-async-http

官網(wǎng):http://loopj.com/android-async-http/

 

使用步驟:

1、創(chuàng)建一個AsyncHttpClient對象

2、創(chuàng)建RequestParams對象并設(shè)置請求參數(shù)(可選)

3、調(diào)用AsyncHttpClient的get或post方法,并傳入AsyncHttpResponseHandler接口的實(shí)現(xiàn)對象,用于處理請求返回。一般匿名內(nèi)部類即可。

 

使用方法:

compile 'com.loopj.android:android-async-http:1.4.9'

自2015年更新1.4.9版本,支持android6.0移除HttpClient帶來的問題后便沒有后續(xù)更新,現(xiàn)在更火的是OkHttp。

 

關(guān)鍵類

AsyncHttpResponseHandler:其余三個的基類,返回子節(jié)數(shù)組,實(shí)現(xiàn)ResponseHandlerInterface

TextHttpResponseHandler:返回字符串

JsonHttpResponseHandler:返回JSONObject或JSONArray或String

BaseJsonHttpResponseHandler:返回傳入的實(shí)體類對象

 

創(chuàng)建一個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分別對應(yīng)成功、失敗的處理代碼。也可以重寫onStart和onFinish處理啟動和結(jié)束的邏輯,一般我用來顯示和隱藏加載對話框

 

TextHttpResponseHandler

一開始不知道有這么一個類,每次都手動將byte[]轉(zhuǎn)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對象,這個類相比其他幾個稍微復(fù)雜,首先需要你自己選擇重寫的父類方法,其次提供了三種重載的方法供你重寫。

onSuccess/onFailure(...JSONArray)

onSuccess/onFailure(...JSONObject)

onSuccess/onFailure(...String)

  查閱源碼可知:JsonHRH會根據(jù)不同的解析結(jié)果調(diào)用不同的onSuccess/onFailure。所以使用這個類,你只需要知道服務(wù)器返回的數(shù)據(jù)格式,并重寫合適的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對象,對于需要轉(zhuǎn)換成Java對象的需求來說,這里還需要自己做一個轉(zhuǎn)換Java對象的操作。這里不太方便,不如直接使用BaseJSONHttpResponseHandler。

 

BaseJsonHttpResponseHandler<JSON_TYPE>

  BaseJSONHttpResponseHandler是一個泛型類,類型參數(shù)是你要反序列化的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是一個實(shí)體類,自帶一個parse方法能將String反序列化程Update對象。在parseResponse中返回解析完成的Java對象,然后在onSuccess中就可以獲得對應(yīng)的Java對象。個人認(rèn)為比JsonHRH來得好用,這里將Json轉(zhuǎn)換Java對象的邏輯放在parseResponse方法里,代碼邏輯更清晰。

 

在實(shí)戰(zhàn)中進(jìn)步:

在請求服務(wù)器,解析Json數(shù)據(jù)這條路上經(jīng)歷了這三個階段:

階段一:只使用AsyncHttpResponseHandler

每次都手動將byte[]轉(zhuǎn)String,然后新增一個類JsonUtil用于將String轉(zhuǎn)換成Java對象,代碼非常的臃腫。

階段二:使用TextHttpResponseHandler

省去了byte[]轉(zhuǎn)String的過程。但是依然需要JsonUtil來轉(zhuǎn)換Java對象

階段三:使用BaseJsonHttpResponseHandler。

將轉(zhuǎn)換過程放在每一個JavaBean類中。代碼可以更簡潔易懂。

 

同樣對于json解析,以前的做法是:

1、新增一個JavaBean

2、在JsonUtil中新增一個getJavaBean()的方法用于反序列化(使用Gson)

  由于Gson在使用過程中使用泛型遇到“類型擦除”的問題,找不到解決方法。對于每一個JavaBean都需要新增一個getJavaBean的方法來解析出對應(yīng)的JavaBean,顯得代碼很臃腫。

解決方法:

方法1、在每一個JavaBean中增加一個parse的方法用于解析Json,解析方法與實(shí)體類綁定。

方法2、使用BaseJsonHttpResponseHandler,將解析過程與業(yè)務(wù)邏輯分離。

 

  在新手階段,對于網(wǎng)絡(luò)上推薦的第三方框架,遵循拿來就用的原則,并沒有進(jìn)行過多的學(xué)習(xí)。這樣使用效果非常差,對于實(shí)現(xiàn)原理的不理解,沒有閱讀過源代碼,使用起來也是流于形式。多多了解其實(shí)現(xiàn)原理,才能夠得心應(yīng)手。

 

 

 

 

新聞標(biāo)題:AsyncHttpClient實(shí)戰(zhàn)總結(jié)及思考
URL分享:http://bm7419.com/article16/psdpdg.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站內(nèi)鏈、網(wǎng)站設(shè)計搜索引擎優(yōu)化、響應(yīng)式網(wǎng)站關(guān)鍵詞優(yōu)化、云服務(wù)器

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)

網(wǎng)站建設(shè)網(wǎng)站維護(hù)公司