android-async-http AsyncHttpClient介紹

  前一陣子剛搬了家,加上公司要發新版本,因此一直比較忙,文章也好幾周沒更新了。可貴這個週末有空,正好周內偶然間閒逛android

發現這個很不錯的第三方開源類庫,針對Android開發中發送http請求的。git

  在Android開發中,發送、處理http請求簡直太常見了,以致於咱們的代碼裏處處充斥着各類HttpClient和與之相關又臭又長的代碼,github

它們存在於你代碼的各個角落,每次看見都使人做嘔,而你僅僅是爲了server能返回一個string或者json給你。每次當我本身寫這樣ajax

的代碼時,我都會想能不能簡化下這個流程,可能二、3行代碼就能搞定。由於針對最簡單的case,我只須要提供request url,成功時的apache

callback和(或)失敗時的callback,僅此而已。針對這一類問題(需求),能夠說android-async-http提供了幾乎完美的解決方案。json

經過使用它能夠大大簡化你的代碼,不只如此,你的代碼看上去也優雅多了。api

  當我第一眼看到它時就被吸引住了,特別是async關鍵字,幹咱們這行的都知道,這是異步執行,也就是說它的網絡請求自動在非UIcookie

線程裏執行,你不須要任何額外的操做(好比手動new一個Thread之類)。項目的官方網站:網絡

http://loopj.com/android-async-http/,對應的github地址:https://github.com/loopj/android-async-http併發

  我這裏簡要介紹下:它是專門針對Android在Apache的HttpClient基礎上構建的異步的callback-based http client。全部的請求

全在UI線程以外發生,而callback發生在建立它的線程中,應用了Android的Handler發送消息機制。你也能夠把AsyncHttpClient應用在

Service中或者後臺線程中,庫代碼會自動識別出它所運行的context。它的feature包括:

1. 發送異步http請求,在匿名callback對象中處理response;

2. http請求發生在UI線程以外;

3. 內部採用線程池來處理併發請求;

4. GET/POST 參數構造,經過RequestParams類。

5. 內置多部分文件上傳,不須要第三方庫支持;

6. 流式Json上傳,不須要額外的庫;

7. 能處理環行和相對重定向;

8. 和你的app大小相比來講,庫的size很小,全部的一切只有90kb;

9. 自動智能的請求重試機制在各類各樣的移動鏈接環境中;

10. 自動的gzip響應解碼;

11. 內置多種形式的響應解析,有原生的字節流,string,json對象,甚至能夠將response寫到文件中;

12. 永久的cookie保存,內部實現用的是Android的SharedPreferences;

13. 經過BaseJsonHttpResponseHandler和各類json庫集成;

14. 支持SAX解析器;

15. 支持各類語言和content編碼,不只僅是UTF-8。

大概翻譯了下,這些只是大致的概覽,具體的細節還得在使用過程當中慢慢感覺、學習。

  接下來,帶領你們看看應用android-async-http來寫代碼是個啥樣子。簡單來講你只須要3步,

1. 建立一個AsyncHttpClient;

2. (可選的)經過RequestParams對象設置請求參數;

3. 調用AsyncHttpClient的某個get方法,傳遞你須要的(成功和失敗時)callback接口實現,通常都是匿名內部類

,實現了AsyncHttpResponseHandler,類庫本身也提供了好些現成的response handler,你通常不須要本身建立一個。

來看看代碼如何寫:

AsyncHttpClient client = new AsyncHttpClient();
client.get("http://www.google.com", new AsyncHttpResponseHandler() {

    @Override
    public void onStart() {
        // called before request is started
    }

    @Override
    public void onSuccess(int statusCode, Header[] headers, byte[] response) {
        // called when response HTTP status is "200 OK"
    }

    @Override
    public void onFailure(int statusCode, Header[] headers, byte[] errorResponse, Throwable e) {
        // called when response HTTP status is "4XX" (eg. 401, 403, 404)
    }

    @Override
    public void onRetry(int retryNo) {
        // called when request is retried
    }
});

是否是很簡潔,有沒有被震撼到?反正我本身第一次看到的時候有種相見恨晚的感受,這簡直就是我日思夜想的方式啊!這裏你只須要經過

匿名內部類的方式實現AsyncHttpResponseHandler,並且更棒的是你只須要override感興趣的方法,好比通常都是onSuccess和onFailure。

這個版本的get方法沒有爲請求傳遞任何參數,固然你也能夠經過RequestParams來傳遞各類參數,以下:

AsyncHttpClient client = new AsyncHttpClient();
RequestParams params = new RequestParams();
params.put("key", "value");
params.put("more", "data");
client.get("http://www.google.com", params, new
    AsyncHttpResponseHandler() {
        @Override
        public void onSuccess(int statusCode, Header[] headers, byte[] response) {
            System.out.println(response);
        }

        @Override
        public void onFailure(int statusCode, Header[] headers, byte[] responseBody, Throwable error) {
            Log.d("ERROR", error);
        }    
    }
);

以上的例子是返回的response直接是原生字節流的狀況,若是你須要把返回的結果當一個String對待,這時只須要匿名實現一個

TextHttpResponseHandler就行,其繼承自AsyncHttpResponse,並將原生的字節流根據指定的encoding轉化成了string對象,

代碼以下:

AsyncHttpClient client = new AsyncHttpClient();
RequestParams params = new RequestParams();
params.put("key", "value");
params.put("more", "data");
client.get("http://www.google.com", params, new
    TextHttpResponseHandler() {
        @Override
        public void onSuccess(int statusCode, Header[] headers, String response) {
            System.out.println(response);
        }

        @Override
        public void onFailure(int statusCode, Header[] headers, String responseBody, Throwable error) {
            Log.d("ERROR", error);
        }    
    }
);

一樣的方式,你能夠發送json請求,代碼以下:

String url = "https://ajax.googleapis.com/ajax/services/search/images";
AsyncHttpClient client = new AsyncHttpClient();
RequestParams params = new RequestParams();
params.put("q", "android");
params.put("rsz", "8");
client.get(url, params, new JsonHttpResponseHandler() {            
    @Override
    public void onSuccess(int statusCode, Header[] headers, JSONObject response) {
       // Handle resulting parsed JSON response here
    }
    @Override
    public void onSuccess(int statusCode, Header[] headers, JSONArray response) {
      // Handle resulting parsed JSON response here
    }
});

看到了沒,返回的response已經自動轉化成JSONObject了,固然也支持JSONArray類型,override你須要的那個版本就行。

  有了AsyncHttpClient,要實現這些功能是否是很簡單呢?固然這裏只是很初級的介紹和使用,剩下的還須要開發者本身參考官方

文檔、源碼(官方甚至提供了一個Sample使用的集合),在實際項目中實踐。最後,強烈建議你們使用,是時候和冗長乏味的代碼說

再見了。我一直是分析源碼的,此次也不例外,實現上的關鍵代碼我會在接下來的博客中專門介紹,敬請期待,enjoy。。。

相關文章
相關標籤/搜索