多多色-多人伦交性欧美在线观看-多人伦精品一区二区三区视频-多色视频-免费黄色视屏网站-免费黄色在线

國內最全IT社區平臺 聯系我們 | 收藏本站
阿里云優惠2
您當前位置:首頁 > php開源 > 綜合技術 > android-async-http AsyncHttpClient介紹

android-async-http AsyncHttpClient介紹

來源:程序員人生   發布時間:2014-10-04 08:00:00 閱讀次數:4049次
在Android開發中,發送、處理http請求簡直太常見了,以至于我們的代碼里到處充斥著各種HttpClient和與之相關又臭又長的代碼,
 
它們存在于你代碼的各個角落,每次看見都令人作嘔,而你僅僅是為了server能返回一個string或者json給你。每次當我自己寫這樣
 
的代碼時,我都會想能不能簡化下這個流程,可能2、3行代碼就能搞定。因為針對最簡單的case,我只需要提供request url,成功時的
 
callback和(或)失敗時的callback,僅此而已。針對這一類問題(需求),可以說android-async-http提供了幾乎完美的解決方案。
 
通過使用它可以大大簡化你的代碼,不僅如此,你的代碼看上去也優雅多了。
 
  當我第一眼看到它時就被吸引住了,特別是async關鍵字,干我們這行的都知道,這是異步執行,也就是說它的網絡請求自動在非UI
 
線程里執行,你不需要任何額外的操作(比如手動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); } } );

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);
        }    
    }
);
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你需要的那個版本就行。
生活不易,碼農辛苦
如果您覺得本網站對您的學習有所幫助,可以手機掃描二維碼進行捐贈
程序員人生
------分隔線----------------------------
分享到:
------分隔線----------------------------
關閉
程序員人生
主站蜘蛛池模板: 欧美激情一区二区三区在线 | 亚洲天堂日本 | 欧美一级性生活视频 | 一区二区中文字幕亚洲精品 | 最近中文字幕2019免费版日本 | 欧美图片另类小说综合 | 国产成人美女福利在线观看 | 国产午夜精品久久久久九九 | www.中文字幕在线观看 | 日本护士xxxxxx | 久久久久无码国产精品一区 | 欧美亚洲国产片在线观看 | 亚洲在线天堂 | 91精品一区二区三区久久久久 | 欧美特级午夜一区二区三区 | 手机看片日韩日韩 | 老司机午夜视频在线观看 | 国产精品区一区二区免费 | 国产精品亚洲精品日韩己满十八小 | 久久国产精品免费看 | 无人区一区二区三区乱码 | 黄色网址免费看 | 性欧美激情videos | 国产jlzzjlzz视频免费 | 久爱免费精品视频在线播放 | 羞羞影院免费观看网址在线 | 精品久久久久久久一区二区伦理 | 亚洲区欧美中文字幕久久 | 久久是精品 | 欧美大片毛片aaa免费看 | 曰曰碰天天碰国产 | 欧美人与动人物姣配xxxx | 亚洲精品第一第二区 | 在线日本中文字幕 | 日韩最新网址 | 男女很舒服爽视频免费 | 欧美日韩国产色综合一二三四 | 在线视频www | 一级毛片真人不卡免费播 | 日本免费一区二区三区三州 | 欧美日韩不卡中文字幕在线 |