async-http使用位址
源碼分析
我們在做網絡請求的時候經常通過下面的方式執行個體化asynchttpclient client=new asynchttpclient();然後通過系統内置的請求發送請求,通過async内部的請求去做真正的網絡請求。
首先得到的是asynchttpclient執行個體,是以從這裡入手分析一下:
對于預設值設定了http協定的預設端口為80,https協定的預設端口為443。
在該函數中調用了<code>asynchttpclient(schemeregistry schemeregistry)</code>構造函數,而真正的執行個體化擷取邏輯過程就在<code>asynchttpclient(schemeregistry schemeregistry)</code>方法中,如下所示:
從代碼的最頂層分析,構造參數傳入的是schemeregistry對象,檢視源碼這是一個靜态的方法,主要存儲一些協定的東西
public schemeregistry() {
super();
registeredschemes = new concurrenthashmap<string,scheme>();
}
上面的代碼我們主要關注下addresponseinterceptor和addresponseinterceptor,此兩個方法主要将我們的請求頭和請求的實體加到httprequest隊列中,對android1.5之前的熟悉的朋友都知道,在最早之前沒有流行這些第三方之前我們就是通過httprequest來請求的,這等同于j2ee的httpservletrequest.
接下來我們調運的就是asynchttpclient裡面的各種get、post、delete等方法,通過看代碼可以發現它們最終調用的都是sendrequest方法,如下:
這個方法的主要作用是将一個新的請求添加到隊列線程池中執行。
調用本方法,主要實作<code>asynchttprequest request = newasynchttprequest(client, httpcontext, urirequest,contenttype, responsehandler, context);</code>這行開始是主要的邏輯,其建立了請求,接着通過<code>threadpool.submit(request);</code>把請求送出到線程池,接着通過<code>requesthandle requesthandle = new requesthandle(request);</code>把請求包裝到requesthandle用于之後的取消、管理等操作。然後坐等現在池的我們請求的這個線程去執行,等待傳回結果。
總結一下:
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方法。
asynchttprequest 繼承自runnabler,被submit至線程池執行網絡請求并發送start,success等消息。
asynchttpresponsehandler 接收請求結果,一般重寫onsuccess及onfailure接收請求成功或失敗的消息,還有onstart,onfinish等消息。
texthttpresponsehandler、jsonhttpresponsehandler、basejsonhttpresponsehandler這些類都繼承自asynchttpresponsehandler,隻是重寫了asynchttpresponsehandler的onsuccess和onfailure方法,将請求結果進行了轉換而已。
requestparams 請求參數,可以添加普通的字元串參數,并可添加file,inputstream上傳檔案。