天天看點

Android網絡請求的第三庫AsyncHttpclient

 項目的官方網站: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。   AsyncHttpclient的使用簡單的可以分為3步: 1.建立AsyncHttpclient

AsyncHttpclient httpclient=new AsyncHttpclient();
           

2.(根據你的需要,是否需要上傳參數)上傳參數

RequestParams params = new RequestParams();
params.put("key", "value");
params.put("more", "data");
           

3.進行網絡請求請求

httpclient.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
    }
});
           

**** 如果你想的連結傳回的是String,隻需要這時隻需要匿名實作一個TextHttpResponseHandle,其繼承自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,隻需要 這時隻需要匿名實作一個 JsonHttpResponseHandler。

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
    }
});
           

注意:将 android-async-http第三方的庫引進項目中,有可能會因為cz.msebera.android.httpclient.Header[] headers找不到而報錯,是以将另外一個jar包的連結位址給大家,一同引入項目即可。httpclient.jar包連接配接:http://mvnrepository.com/artifact/cz.msebera.android/httpclient/4.3.6。