Android-Async-Http 特性簡單分析

来源:http://www.cnblogs.com/sphere/archive/2017/11/08/7804769.html
-Advertisement-
Play Games

如下是官方文檔描述此庫的特點: All requests are made outside of your app’s main UI thread, but any callback logic will be executed on the same thread as the callback ...


如下是官方文檔描述此庫的特點:

All requests are made outside of your app’s main UI thread, but any callback logic will be executed on the same thread as the callback was created using Android’s Handler message passing.
•Using upstream HttpClient of version 4.3.6 instead of Android provided DefaultHttpClient
•Compatible with Android API 23 and higher
•Make asynchronous HTTP requests, handle responses in anonymous callbacks
•HTTP requests happen outside the UI thread
•Requests use a threadpool to cap concurrent resource usage
•GET/POST params builder (RequestParams)
•Multipart file uploads with no additional third party libraries
•Streamed JSON uploads with no additional libraries
•Handling circular and relative redirects
•Tiny size overhead to your application, only 90kb for everything
•Automatic smart request retries optimized for spoĴy mobile connections
•Automatic gzip response decoding support for super-fast requests
•Binary protocol communication with BinaryHttpResponseHandler
•Built-in response parsing into JSON with JsonHttpResponseHandler
•Saving response directly into file with FileAsyncHttpResponseHandler
•Persistent cookie store, saves cookies into your app’s SharedPreferences
•Integration with Jackson JSON, Gson or other JSON (de)serializing libraries with BaseJsonHttpResponseHandler
•Support for SAX parser with SaxAsyncHttpResponseHandler
•Support for languages and content encodings, not just UTF-8


•1、相容Android API23或更高版本
•2、發送非同步的http請求,在匿名的回調callback中處理響應response
•3、Http的請求發生在主線程之外
•4、使用線程池處理併發請求
•5、使用RequestParams構造GET、POST請求參數
•6、流式Json上傳,無需三方庫支持
•7、能處理環形和相對重定向
•8、內置multiPart file 上傳,無需第三方庫支持
•9、相比app來說庫很小,僅僅只有90k
•10、針對移動連接自動智能的請求重試優化機制
•11、自動的gzip響應解碼
•12、支持位元組流響應處理 BinaryHttpResponseHandler
•13、內置Json文本響應處理 JsonHttpResponseHandler
•14、持久化Cookie信息,將Cookie信息保存在應用的SharedPreference中
•15、通過實現抽象類BaseJsonHttpResponseHandler可以無縫對接三方Json解析庫
•16、支持SAX解析器 SaxAsyncHttpResponseHandler
•17、支持各種語言和content編碼,不止是UTF-8

Android-Async-Http 源碼版本1.4.9
  在AsyncHttpClient的構造方法中有對連接各種參數的設置,並實例化了一個預設的線程池threadPool(Executors.newCachedThreadPool)用於提交請求任務AsyncHttpRequest,接著初始化了httpClient,並給請求和響應添加了攔截器以實現自動的gzip解碼,調用AsyncHttpRequest實例的get post等方法時最終會調用sendRequest方法,sendRequest方法接收httpClient、responseHandler、uriRequest等參數,在方法內部會構造請求的AsyncHttpRequest對象(newAsyncHttpRequest),並通過threadPool.submit(request)方法提交到線程池中,何為非同步就體現在這裡。
AsyncHttpRequest實現了Runnable介面,它的run方法就是核心代碼,調用responseHandler.sendxxx 方法以實現各種方法回調和請求結果投遞,在makeRequestWithRetries中有重試的邏輯,具體在retryHandler中有重試次數的判斷,當重試次數超過最大值時(預設是5次),跳出while迴圈,這裡重試的邏輯和Volley中的處理類似 。
其中AsyncHttpClient中預設的線程池沒有核心線程,只有work線程,且工作線程的存活時間是60s,如果此種線程池不能滿足需要,可以實現自己的線程池,並調用setThreadPool方法。
其中在調用AsyncHttpClient中各種請求方法時,會傳入請求響應的各式xxxResponseHandler,針對不同的響應數據類型,有TextHttpResponseHandler、JsonHttpResponseHandler、FileHttpResponseHandler等,這些xxxResponseHandler中封裝了Handler和Looper,因為構造Handler是需要先有Looper的,而looper的初始化是在AsyncHttpResponseHandler構造函數中,
this.looper = looper == null ? Looper.myLooper() : looper,即如果沒有傳入looper則使用當前線程的looper(即創建xxxResponseHandler的線程,可能是主線程也可能是子線程)。 這些xxxResponseHandler都繼承自AsyncHttpResponseHandler類,並實現了
onSuccess(int statusCode, Header[] headers, byte[] responseBody) 和 onFailure(int statusCode, Header[] headers, byte[] responseBody, Throwable error)方法,以處理不同返回數據類型的響應。
如上敘述印證了2 、3、4、10、11條結論。
---------------------------------------------------------------------------------------------------------------------------------------------

 

上傳圖片文件到chuantu.biz,代碼如下

AsyncHttpClient httpClient = new AsyncHttpClient();
        RequestParams params = new RequestParams();

        try {
            String filePath = getBaseContext().getExternalCacheDir().getPath() + File.separator + "IMG_20171106_202814.jpg";
            File file = new File(filePath);
            if (file.exists()) {
                params.put("uploadimg", file, "image/jpeg");
            }

        } catch (FileNotFoundException e) {
            e.printStackTrace();
        }

        httpClient.setProxy("172.20.10.2", 8888);


        httpClient.post(this, "http://www.chuantu.biz/upload.php", /*headers,*/ params,/* null,*/ new TextHttpResponseHandler() {
            @Override
            public void onSuccess(int statusCode, Header[] headers, String responseBody) {
                printHeaders(headers);
                Log.d(TAG, responseBody);
            }

            @Override
            public void onFailure(int statusCode, Header[] headers, String responseBody, Throwable error) {

            }
        });

  

 

 

如上印證了5 、8 兩條特性。

 


  上傳文件時,會調用RequestParams中的createMultipartEntity方法,其中SimpleMulitpartEntity的addPart方法會添加待寫入流中的文件信息,之後將文件內容的位元組寫入到流中,具體見SimpleMultipartEntity的writeTo方法,其中SimpleMultipartEntity類實現了HttpEntity介面,其中重寫了getContentType方法,此方法中返回標識性的header信息,Content-Type:multipart/form-data;boundary= xxxxxx, 分界線標識的字元串是在數字大小寫字元等字元中隨機抽取出來的30個字元組成。

需要註意到構造AsyncHttpRequest時最後的參數context, 如果context不為空,請求會被放到
Map中,以便在Activity onPause的時候或者onDestory的時候取消掉無用的請求等。
-------------------------------------------------------------------------------------------------------------------

BaseJsonHttpResponseHandler的使用

先添加Gson依賴,compile 'com.google.code.gson:gson:2.8.1'
這裡以kuaidi100的快遞數據為例:http://www.kuaidi100.com/query?type=xxx&postid=xxxx
先創建一個快遞數據類的實體(這裡欄位並不全,只是為了說明問題,具體可以自行調試介面)

public class Express {
    public String message;
    public String nu;
    public int isCheck;
    public String com;
    public int status;
    public int state;

    public Express(String message, String nu, int isCheck, String com, int status, int state) {
        this.message = message;
        this.nu = nu;
        this.isCheck = isCheck;
        this.com = com;
        this.status = status;
        this.state = state;
    }

    @Override
    public String toString() {
        return "Express{" + "message='" + message + '\'' + ", nu='" + nu + '\'' + ", isCheck=" + isCheck
                + ", com='" + com + '\'' + ", status=" + status + ", state=" + state + '}';
    }
}

  

創建RequestParams 發起GET請求

RequestParams params = new RequestParams();
        params.put("type", "shunfeng");
        params.put("postid", "384566812983");


        httpClient.get("http://www.kuaidi100.com/query", params, new BaseJsonHttpResponseHandler<Express>() {
            @Override
            public void onSuccess(int statusCode, Header[] headers, String rawJsonResponse, Express response) {
                Log.d(TAG, "response = " + response);
            }

            @Override
            public void onFailure(int statusCode, Header[] headers, Throwable throwable, String rawJsonData, Express errorResponse) {

            }

            @Override
            protected Express parseResponse(String rawJsonData, boolean isFailure) throws Throwable {
                Gson gson = new Gson();
                return gson.fromJson(rawJsonData, Express.class);
            }
        });

  


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 最近在學習視頻相關的知識,現在也是在按部就班的一步步的來,如果有同樣需求的同學可以跟著大家一起促進學習。 上一節說到了可以使用系統播放器以及瀏覽器播放本地以及網路視頻,但是這在很大程度上並不能滿足我們的需求,幸好,android系統為我們提供了一個很方便的系統API——VideoView,來支持我們 ...
  • http://m.blog.csdn.net/potato512/article/details/51487643 ...
  • (1)什麼是IDFA 關於IDFA,在提交應用到App Store時,iTunes Connect有如下說明: 這裡說到檢查項目中是否包含IDFA,那如何來對iOS項目(包括第三方SDK)檢查是否包含IDFA呢? (2)檢查IDFA的方法: 步驟: 1、打開終端cd到要檢查的文件的根目錄。 2、執行 ...
  • iOS獲取設備唯一標識的各種方法?IDFA、IDFV、UDID分別是什麼含義? [摘要:1、UDID (Unique Device Identifier) UDID的齊稱是Unique Device Identifier,望文生義,它便是蘋果IOS裝備的獨一辨認碼,它由40個字元的字母戰數字構成。正 ...
  • 繼上次解決微軟office Android版Excel下載並打開Excel文件修改後(http://anforen.com/wp/2017/11/excel-android-mobile/),再上傳出現怪問題後。 這次再遇新問題。 上次是改用國產的wps Android版來解決問題的。 (原文首發在 ...
  • 微軟官方的Excel android 移動版,有重大bug。害我折騰了一天多時間。最終確認是Excel自身的問題。 現象描述:手機上新建或是保存excel後。放到電腦上,不能打開。提示”Excel在Book1.xlsx“中發現不可讀取的內容。是否恢復此工作簿的內容?如果信任此工作簿的來源,請單擊”是 ...
  • iOS11發佈了不少時候了,好像沒人能說清楚UIScrollView的contentInsetAdjustmentBehavior值的真正含義。 本文以Demo的形式,闡述了contentInsetAdjustmentBehavior值之間的含義對比。 ...
  • android在系統配置發生改變時,Activity會被重新創建,但是某些情況下我們希望系統配置改變時不會重新創建Activity,這個時候我們可以給Activity指定相對應的configChanges屬性,在manifest加入 orientation:屏幕方向發生了改變,如旋轉屏幕 scree ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...