頻道欄目
首頁 > 資訊 > Android > 正文

網絡請求庫之android-async-http

16-08-18        來源:[db:作者]  
收藏   我要投稿

Android中網絡請求一般使用Apache HTTP Client或者采用HttpURLConnect,但是直接使用這兩個類庫需要寫大量的代碼才能完成網絡post和get請求,而使用android-async-http這個庫可以大大的簡化操作,它是基于Apache’s HttpClient ,所有的請求都是獨立在UI主線程之外,通過回調方法處理請求結果,采用android Handler message 機制傳遞信息。在 iOS開發中有大名鼎鼎的ASIHttpRequest庫,用來處理網絡請求操作,今天要介紹的是一個在Android上同樣強大的網絡請求庫android-async-http(官方網址:https://loopj.com/android-async-http/),目前非;鸬膽肐nstagram和Pinterest的Android版就是用的這個網絡請求庫。這個網絡請求庫是基于Apache HttpClient庫之上的一個異步網絡請求處理庫,網絡處理均基于Android的非UI線程,通過回調方法處理請求結果。

其主要特征如下:

處理異步Http請求,并通過匿名內部類處理回調結果Http請求均位于非UI線程,不會阻塞UI操作通過線程池處理并發請求處理文件上傳、下載
采用RequestParams類創建GET/POST參數不需要第三方包即可支持Multipart file文件上傳大小只有25kb自動為各種移動電話處理連接斷開時請求重連超快的自動gzip響應解碼支持使用BinaryHttpResponseHandler類下載二進制文件(如圖片)使用JsonHttpResponseHandler類可以自動將響應結果解析為json格式持久化cookie存儲,可以將cookie保存到你的應用程序的SharedPreferences中

android-async-http實現下載

添加依賴:

 

dependencies {
  compile 'com.loopj.android:android-async-http:1.4.9'
}

創建asyncHttpClient對象:

AsyncHttpClient asyncHttpClient= new AsyncHttpClient();

調用asyncHttpClient對象的get方法:

private void asyncGetMethod() {

        asyncHttpClient.get(url, new AsyncHttpResponseHandler() {//接收請求結果,一般重寫onSuccess及onFailure接收請求成功或失敗的消息,還有onStart,onFinish等消息
            @Override
            public void onSuccess(int statusCode, Header[] headers, byte[] responseBody) {
                // called when response HTTP status is "200 OK"
                if(statusCode==200){
//                Log.e("dy",new String(responseBody));
                    Bitmap bitmap = BitmapFactory.decodeByteArray(responseBody, 0, responseBody.length);
                    imageView.setImageBitmap(bitmap);//回調發生在創建它的線程中
                }
            }

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

        });
    }

記得不要忘記加上網絡訪問權限。

這樣一個簡單的網絡訪問請求就完成了。效果圖如下:
 
callback發生在創建它的線程中,應用了Android的Handler發送消息機制。你也可以把AsyncHttpClient應用在Service中或者后臺線程中,庫代碼會自動識別出它所運行的context。
當然你也可以通過RequestParams來傳遞各種參數。

 

private void asyncGetMethodWithParams() {
        params = new RequestParams();
        params.put("key","ce3ed11412e24cb9ac909a54ba8fbbd1");
        params.put("company","zhongtong");
        params.put("id","719235004847");
        asyncHttpClient.get(url2,params,new TextHttpResponseHandler() {
            @Override
            public void onFailure(int statusCode, Header[] headers, String responseString, Throwable throwable) {

            }

            @Override
            public void onSuccess(int statusCode, Header[] headers, String responseString) {
                textView.setText(responseString);
            }
        });
    }

效果圖:

 

TextHttpResponseHandler,其繼承自AsyncHttpResponse,并將原生的字節流根據指定的encoding轉化成了string對象。同樣的方式,你可以發送json請求,代碼如下:

 

private void sendJsonRequest() {
        params=new RequestParams();
        params.put("key","ce3ed11412e24cb9ac909a54ba8fbbd1");
        params.put("company","zhongtong");
        params.put("id","719235004847");
        asyncHttpClient.get(url2,params,new JsonHttpResponseHandler(){
            @Override
            public void onSuccess(int statusCode, Header[] headers, JSONObject response) {
                // Handle resulting parsed JSON response here
                try {
                    Log.e("dy",response.getString("result"));
                } catch (JSONException e) {
                    e.printStackTrace();
                }
            }

        });
    }

返回的response已經自動轉化成JSONObject了,當然也支持JSONArray類型,override你需要的那個版本就行。android-async-http的基本用法就上面那些,另外,官方建議我們Make a Static Http Client,即寫一個靜態的httpClient對象,代碼如下:

 

 

public class MyHttpClient {
    private static final String BASE_URL="http://api.avatardata.cn";
    private static AsyncHttpClient client=new AsyncHttpClient();
    public static void get(String url, RequestParams params, AsyncHttpResponseHandler responseHandler){
        client.get(getAbsoluteUrl(url),params,responseHandler);
    }
    public static void post(String url,RequestParams params,AsyncHttpResponseHandler responseHandler){
        client.post(getAbsoluteUrl(url),params,responseHandler);
    }

    private static String getAbsoluteUrl(String relativeUrl) {
        return BASE_URL+relativeUrl;
    }
}

private void staticHttpClient() {
        params=new RequestParams();
        params.put("key","ce3ed11412e24cb9ac909a54ba8fbbd1");
        params.put("company","zhongtong");
        params.put("id","719235004847");
        MyHttpClient.get(url2,params,new JsonHttpResponseHandler(){
            @Override
            public void onSuccess(int statusCode, Header[] headers, JSONObject response) {
                // If the response is JSONObject instead of expected JSONArray
                try {
                    String error = response.getString("result");
                    textView.setText(error);
                } catch (JSONException e) {
                    e.printStackTrace();
                }
            }
        });
    }

上述源碼下載:源碼

 

android-async-http實現上傳

待續。。。

 

 

主要類介紹

AsyncHttpRequest 繼承自Runnabler,被submit至線程池執行網絡請求并發送start,success等消息
AsyncHttpResponseHandler 接收請求結果,一般重寫onSuccess及onFailure接收請求成功或失敗的消息,還有onStart,onFinish等消息
TextHttpResponseHandler 繼承自AsyncHttpResponseHandler,只是重寫了AsyncHttpResponseHandler的onSuccess和onFailure方法,將請求結果由byte數組轉換為String
JsonHttpResponseHandler 繼承自TextHttpResponseHandler,同樣是重寫onSuccess和onFailure方法,將請求結果由String轉換為JSONObject或JSONArray
BaseJsonHttpResponseHandler 繼承自TextHttpResponseHandler,是一個泛型類,提供了parseResponse方法,子類需要提供實現,將請求結果解析成需要的類型,子類可以靈活地使用解析方法,可以直接原始解析,使用gson等。
RequestParams 請求參數,可以添加普通的字符串參數,并可添加File,InputStream上傳文件
AsyncHttpClient 核心類,使用HttpClient執行網絡請求,提供了get,put,post,delete,head等請求方法,使用起來很簡單,只需以url及RequestParams調用相應的方法即可,還可以選擇性地傳入Context,用于取消Content相關的請求,同時必須提供ResponseHandlerInterface(AsyncHttpResponseHandler繼承自ResponseHandlerInterface)的實現類,一般為AsyncHttpResponseHandler的子類,AsyncHttpClient內部有一個線程池,當使用AsyncHttpClient執行網絡請求時,最終都會調用sendRequest方法,在這個方法內部將請求參數封裝成AsyncHttpRequest(繼承自Runnable)交由內部的線程池執行。
SyncHttpClient 繼承自AsyncHttpClient,同步執行網絡請求,AsyncHttpClient把請求封裝成AsyncHttpRequest后提交至線程池,SyncHttpClient把請求封裝成AsyncHttpRequest后直接調用它的run方法。

請求流程:

 

調用AsyncHttpClient的get或post等方法發起網絡請求所有的請求都走了sendRequest,在sendRequest中把請求封裝為了AsyncHttpRequest,并添加到線程池執行當請求被執行時(即AsyncHttpRequest的run方法),執行AsyncHttpRequest的makeRequestWithRetries方法執行實際的請求,當請求失敗時可以重試。并在請求開始,結束,成功或失敗時向請求時傳的ResponseHandlerInterface實例發送消息基本上使用的都是AsyncHttpResponseHandler的子類,調用其onStart,onSuccess等方法返回請求結果

其他說明

Android-Async-Http的使用非常簡單,通過AsyncHttpClient發起請求就可以了,如果需要添加參數,直接傳一個RequestParams過去,而且參數可以是String、File和InputStream,可以很方便地上傳文件。 每個請求都需要傳一個ResponseHandlerInterface的實例用以接收請求結果或請求失敗,請求結束等通知,一般是AsyncHttpResponseHandler的子類。通過BinaryHttpResponseHandler可以發起二進制請求,如請求圖片。通過TextHttpResponseHandler可以發起返回結果為字符串的請求,一般這個使用較多。
也可以使用它的子類JsonHttpResponseHandler,返回結果是一個JSONObject或JSONArray。不過感覺這個類作用不大,一是有另一個類BaseJsonHttpResponseHandler,可以直接解析返回的JSON數據,二是JsonHttpResponseHandler的方法太復雜了,有太多的onSuccess和onFailure方法,都不知道重寫哪個了。
相關TAG標簽
上一篇:臺積電:絕大多數7nm客戶都會轉向6nm_IT新聞_博客園
下一篇:最后一頁
相關文章
圖文推薦

關于我們 | 聯系我們 | 廣告服務 | 投資合作 | 版權申明 | 在線幫助 | 網站地圖 | 作品發布 | Vip技術培訓 | 舉報中心

版權所有: 紅黑聯盟--致力于做實用的IT技術學習網站

美女MM131爽爽爽毛片