1. 程式人生 > >AsyncHttpClient 實戰總結及思考

AsyncHttpClient 實戰總結及思考

第一次參加工作時使用的網路框架是AsyncHttpClient,雖說該框架使用非常簡潔,但是使用的過程同時也是初學者成長與思考的過程。在專案的不同階段,重新查閱網路請求的程式碼,總能想到一些優化的方法,或大或小。

使用步驟:

1、建立一個AsyncHttpClient物件

2、建立RequestParams物件並設定請求引數(可選)

3、呼叫AsyncHttpClient的get或post方法,並傳入AsyncHttpResponseHandler介面的實現物件,用於處理請求返回。一般匿名內部類即可。

使用方法:

compile 'com.loopj.android:android-async-http:1.4.9'

自2015年更新1.4.9版本,支援android6.0移除HttpClient帶來的問題後便沒有後續更新,現在更火的是OkHttp。

關鍵類

AsyncHttpResponseHandler:其餘三個的基類,返回子節陣列,實現ResponseHandlerInterface

TextHttpResponseHandler:返回字串

JsonHttpResponseHandler:返回JSONObject或JSONArray或String

BaseJsonHttpResponseHandler:返回傳入的實體類物件

建立一個AsyncHttpClient物件

AsyncHttpClient asyncHttpClient = newAsyncHttpClient();

AsyncHttpResponseHandler

asyncHttpClient.post(url, new AsyncHttpResponseHandler() {
    @Override
    public void onSuccess(int statusCode, Header[] headers, byte[] responseBody) {
    }
    @Override
    public void onFailure(int statusCode, Header[] headers, byte[] responseBody, Throwable error) {
    }
});

  通常重寫onSuccess和onFailure分別對應成功、失敗的處理程式碼。也可以重寫onStart和onFinish處理啟動和結束的邏輯,一般我用來顯示和隱藏載入對話方塊

TextHttpResponseHandler

一開始不知道有這麼一個類,每次都手動將byte[]轉String,這個比較常用。

asyncHttpClient.get(url, newTextHttpResponseHandler() {
    @Override
    public void onSuccess(int statusCode, Header[] headers, String responseString) {
    }
    @Override
    public void onFailure(int statusCode, Header[] headers, String responseString, Throwable throwable) {
    }
});

JsonHttpResponseHandler

  用於直接返回Json物件,這個類相比其他幾個稍微複雜,首先需要你自己選擇重寫的父類方法,其次提供了三種過載的方法供你重寫。

onSuccess/onFailure(...JSONArray)

onSuccess/onFailure(...JSONObject)

onSuccess/onFailure(...String)

  查閱原始碼可知:JsonHRH會根據不同的解析結果呼叫不同的onSuccess/onFailure。所以使用這個類,你只需要知道伺服器返回的資料格式,並重寫合適的onSuccess/onFailure即可。

asyncHttpClient.get(url, new JsonHttpResponseHandler(){
    @Override
    public void onSuccess(int statusCode, Header[] headers, JSONArray response) {
    }
    @Override
    public void onFailure(int statusCode, Header[] headers, Throwable throwable, JSONArray errorResponse) {
    }
    @Override
    public void onSuccess(int statusCode, Header[] headers, JSONObject response) {
    }
    @Override
    public void onFailure(int statusCode, Header[] headers, Throwable throwable, JSONObject errorResponse) {
    }
    @Override
    public void onSuccess(int statusCode, Header[] headers, String responseString) {
    }
    @Override
    public void onFailure(int statusCode, Header[] headers, String responseString, Throwable throwable) {
    }
    @Override
    public void onRetry(int retryNo) {
    }
});

  備註:這裡返回的是 JSONObject或JSONArray物件,對於需要轉換成Java物件的需求來說,這裡還需要自己做一個轉換Java物件的操作。這裡不太方便,不如直接使用BaseJSONHttpResponseHandler。

BaseJsonHttpResponseHandler<JSON_TYPE>

  BaseJSONHttpResponseHandler是一個泛型類,型別引數是你要反序列化的JavaBean。也是用於直接返回Json物件,不同於JsonHRH的是你需要重寫parseResponse方法,自己完成Json的反序列化。方便你使用Gson、Jackson Json等第三方框架。

asyncHttpClient.get(url, new BaseJsonHttpResponseHandler<Update>() {
    @Override
    public void onSuccess(int statusCode, Header[] headers, String rawJsonResponse, Update response) {
    }
    @Override
    public void onFailure(int statusCode, Header[] headers, Throwable throwable, String rawJsonData, Update errorResponse) {
    }
    @Override
    protected Update parseResponse(String rawJsonData, boolean isFailure) throws Throwable {
        return Update.parse(rawJsonData);//自己完成反序列化
    }
});

  這裡的Update是一個實體類,自帶一個parse方法能將String反序列化程Update物件。在parseResponse中返回解析完成的Java物件,然後在onSuccess中就可以獲得對應的Java物件。個人認為比JsonHRH來得好用,這裡將Json轉換Java物件的邏輯放在parseResponse方法裡,程式碼邏輯更清晰。

在實戰中進步:

在請求伺服器,解析Json資料這條路上經歷了這三個階段:

階段一:只使用AsyncHttpResponseHandler

每次都手動將byte[]轉String,然後新增一個類JsonUtil用於將String轉換成Java物件,程式碼非常的臃腫。

階段二:使用TextHttpResponseHandler

省去了byte[]轉String的過程。但是依然需要JsonUtil來轉換Java物件

階段三:使用BaseJsonHttpResponseHandler。

將轉換過程放在每一個JavaBean類中。程式碼可以更簡潔易懂。

同樣對於json解析,以前的做法是:

1、新增一個JavaBean

2、在JsonUtil中新增一個getJavaBean()的方法用於反序列化(使用Gson)

  由於Gson在使用過程中使用泛型遇到“型別擦除”的問題,找不到解決方法。對於每一個JavaBean都需要新增一個getJavaBean的方法來解析出對應的JavaBean,顯得程式碼很臃腫。

解決方法:

方法1、在每一個JavaBean中增加一個parse的方法用於解析Json,解析方法與實體類繫結。

方法2、使用BaseJsonHttpResponseHandler,將解析過程與業務邏輯分離。

  在新手階段,對於網路上推薦的第三方框架,遵循拿來就用的原則,並沒有進行過多的學習。這樣使用效果非常差,對於實現原理的不理解,沒有閱讀過原始碼,使用起來也是流於形式。多多瞭解其實現原理,才能夠得心應手。

相關推薦

AsyncHttpClient 實戰總結思考

第一次參加工作時使用的網路框架是AsyncHttpClient,雖說該框架使用非常簡潔,但是使用的過程同時也是初學者成長與思考的過程。在專案的不同階段,重新查閱網路請求的程式碼,總能想到一些優化的方

829號日報總結思考

需要 商品 儀器 支付 阿裏 習慣 利用 戰略 結合 1、格力和天貓的戰略合作。利用格力電器的核心科技與天貓大數據相結合,針對用戶,制定出適應性的,更合適的產品。 2、阿裏新零售,新布局。在社區,針對居民購物習慣,賣相應貨品。商家可以更合理的進行管理。 3、蘇寧無人店主要提

【原創】軟體架構技術發展歷程總結思考 1of2(待續)

軟體架構技術的發展歷程總結及思考1of2(待續) 駱金鬆 1   軟體架構技術產生的背景 1.1     軟體危機的出現     20 世紀60年代以前,計算機剛剛投入實際使用,軟體設計往往只是為了一個特定的應用而在指定的計算機上設計和編制,採用密切依賴於計算機的機器程式碼或

XP方法學習總結對小組開發的思考

是個 note 使用 進一步 根據 數據科學家 pos 範圍 log 眾所周知,數據科學是這幾年才火起來的概念,而應運而生的數據科學家(data scientist)明顯缺乏清晰的錄取標準和工作內容。此次課程以《星際爭霸II》回放文件分析為例,集中在IBM Cloud相關數

兄弟連區塊鏈教程btcpool礦池源碼分析核心機制總結優化思考

tcp dup 最大 啟動 清除 延時 超時 too 文件名 btcpool礦池-核心機制總結及優化思考 核心機制總結 ①gbtmaker 監聽Bitcoind ZMQ中BITCOIND_ZMQ_HASHBLOCK消息,一有新塊產生,將立即向kafka發送新Gbt 另默認

HTTPS(SSL / TLS)免費證書申請網站證書部署實戰總結

oracl 小夥伴 重啟tomcat 域名 .net cer strong smi ssl證書 服務器環境:windows server 2008 + tomcat7 廢話不多說,先看部署效果: 一、免費證書申請 Let‘s Encrypt 簡介:let‘s

機器學習技法筆記總結(一)SVM系列總結實戰

機器學技法筆記總結(一)SVM系列總結及實戰 1、原理總結 在機器學習課程的第1-6課,主要學習了SVM支援向量機。 SVM是一種二類分類模型。它的基本模型是在特徵空間中尋找間隔最大化的分離超平面的線性分類器。 (1)當訓練樣本線性可分時,通過硬間隔最大化,學習

HBase之Rowkey設計總結方舟實戰

一、引言 HBase由於其儲存和讀寫的高效能,在OLAP即時分析中越來越發揮重要的作用,在易觀精細化運營產品--易觀方舟也有廣泛的應用。作為Nosql資料庫的一員,HBase查詢只能通過其Rowkey來查詢(Rowkey用來表示唯一一行記錄),Rowkey設計的優劣直接影響讀

HBase之Rowkey設計總結易觀方舟實戰

  置頂 2018年06月02日 21:52:46 代立冬 閱讀數:1699 標籤:  Rowkey設計經驗hbase經驗總結易觀方舟rowkey設計實踐rowkey實戰 更多 個人分類: ●HBase

頁面搭建工具總結架構思考

在初步完成了線上流程圖編輯工具之後,又接到了線上搭建頁面工具的需求,剛開始其實並不想接專案,因為從歷史以及現實原因來看,個性化及動態渲染都是很難解決的痛點,各種H5頁面搭建工具的不溫不火早已說明了這條路並沒有這麼好走,但從另一個方面來說,既然有了這樣的需求,那也就說明了現實的工作流程確實存在問題,本著解

JVM調優大全實戰總結

文章目錄 JVM 型別 JVM 記憶體中的概念及分割槽 在JDK6及之前的版本 JDK7及之後的版本 為什麼叫Hot Spot? 效能調優的程式 效能調優的

AOP之AspectJ 技術原理詳解實戰總結

一、AOPAOP是OOP的延續,是軟體開發中的一個熱點,也是Spring框架中的一個重要內容,是函數語言程式設計的一種衍生範型。利用AOP可以對業務邏輯的各個部分進行隔離,從而使得業務邏輯 各部分之間的耦合度降低,提高程式的可重用性,同時提高了開發的效率。1.1 主要功能日誌

【機器學習實戰】Logistic迴歸 總結思考

【機器學習實戰】Logistic迴歸 全部程式均是依照《機器學習實戰》書寫,然後進行了一些修改(順便鞏固python) Logistic原理簡單解釋 作者在書中這樣描述Logistic迴歸 根據現有資料對分類邊界線建立迴歸公式,以此進行分類 --《機器學習實戰》P73 這本書對於理論的東

使用tensorflow2識別4位驗證碼思考總結

在學習了CNN之後,自己想去做一個驗證碼識別,網上找了很多資料,雜七雜八的一大堆,但是好多是tf1寫的,對tf1不太熟悉,有點看不懂,於是自己去摸索吧。 摸索的過程是異常艱難呀,一開始我直接用captcha 生成了10080張驗證碼去識別,發現loss一直停留在2.3左右,accuracy一直是0.1左右,訓

MySQL Proxy 讀寫分離(實戰總結

mysql proxy;讀寫分離 規劃: 主mysql服務器:192.168.1.21 從mysql服務器: 192.168.1.22 mysql讀寫分離器:192.168.1.23 1、讀寫分離服務器上解壓安裝包,並添加對應用戶,並編輯啟動腳本; # tar xf mysql-proxy-

Vue.js 實戰總結

體會 git api display int 最新 團隊 輕量 開始 最近在某個項目中用到了Vue.js,從上手做開發到項目發布,一步步踩了不少坑。本文試圖總結過去一個多月使用Vue.js中的一些經驗,也算是一點心得體會吧,拿出來與大家分享,歡迎多多交流。 Vue.js簡

html網頁設計細節總結實踐經驗總結

text 文件路徑 -1 div 提醒 進制的轉換 改換 slice 對話 1) <link rel=” ” type=”text/css” href=”__.css”>是空元素,僅包含屬性。用來定義文檔與外部資源的關系,常用於鏈接樣式表

2015總結思考

不想 總結 swe 數據 map 類比 未來 傳說 server 昨天晚上出去和幾個朋友交流了一下。聊了非常多,思考了一下這一年學習技術的經歷,趁著在宿舍養病,將自己的想法記錄了下來。 總結過去與思考 從開始決定當碼農到如今將近兩年零三個月,起初是由於自己專業的科研不是

需要整理思考的一些事情

結果 閱讀 筆記 書籍 2個 讀書筆記 效率 滿足 讀書 1、工作時長及如何保證結果; 2、如何保證每一段時間只做一件事情,措施方法 3、搞清楚別人得需求(關心什麽,能否滿足,如何滿足,如何做到99分) 4、思考每天真正需要花時間投入的事情,然後全力投入 5、如何合理的分配

spring同mybatis整合的總結配置

tlist onf -m cut factory 註入 ood cto wid 1.Spring同mybatis的整合步驟? 整合的代碼: <bean id="dataSource" destroy-method="clo