先來看一下最基本的用法android
AsyncHttpClient client = new AsyncHttpClient(); client.get("http://www.google.com", new AsyncHttpResponseHandler() { @Override public void onSuccess(String response) { System.out.println(response); } });
經過AsyncHttpClient類的實例就能夠執行網絡請求,包括get、put、post、head、delete。並指定一個ResponseHandlerInterface的實例接收請求結果。(onSuccess參數不對,此處只說明基本用法,詳細參數看源碼)數據庫
繼承自Runnabler,被submit至線程池執行網絡請求併發送start,success等消息api
接收請求結果,通常重寫onSuccess及onFailure接收請求成功或失敗的消息,還有onStart,onFinish等消息數組
繼承自AsyncHttpResponseHandler,只是重寫了AsyncHttpResponseHandler的onSuccess和onFailure方法,將請求結果由byte數組轉換爲String網絡
繼承自TextHttpResponseHandler,一樣是重寫onSuccess和onFailure方法,將請求結果由String轉換爲JSONObject或JSONArray併發
繼承自TextHttpResponseHandler,是一個泛型類,提供了parseResponse方法,子類須要提供實現,將請求結果解析成須要的類型,子類能夠靈活地使用解析方法,能夠直接原始解析,使用gson等。async
請求參數,能夠添加普通的字符串參數,並可添加File,InputStream上傳文件ide
核心類,使用HttpClient執行網絡請求,提供了get,put,post,delete,head等請求方法,使用起來很簡單,只需以url及RequestParams調用相應的方法便可,還能夠選擇性地傳入Context,用於取消Content相關的請求,同時必須提供ResponseHandlerInterface(AsyncHttpResponseHandler繼承自ResponseHandlerInterface)的實現類,通常爲AsyncHttpResponseHandler的子類,AsyncHttpClient內部有一個線程池,當使用AsyncHttpClient執行網絡請求時,最終都會調用sendRequest方法,在這個方法內部將請求參數封裝成AsyncHttpRequest(繼承自Runnable)交由內部的線程池執行。函數
繼承自AsyncHttpClient,同步執行網絡請求,AsyncHttpClient把請求封裝成AsyncHttpRequest後提交至線程池,SyncHttpClient把請求封裝成AsyncHttpRequest後直接調用它的run方法。oop
官方建議使用一個靜態的AsyncHttpClient,像下面的這樣:
public class TwitterRestClient { private static final String BASE_URL = "http://api.twitter.com/1/"; 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; } }
封裝的方法建議都加上Context參數,以在Activity pause或stop時取消掉沒用的請求。
詳細使用方法就不說了,直接看官方文檔
Android-Async-Http的使用很是簡單,經過AsyncHttpClient發起請求就能夠了,若是須要添加參數,直接傳一個RequestParams過去,並且參數能夠是String、File和InputStream,能夠很方便地上傳文件。
每一個請求都須要傳一個ResponseHandlerInterface的實例用以接收請求結果或請求失敗,請求結束等通知,通常是AsyncHttpResponseHandler的子類。
經過BinaryHttpResponseHandler能夠發起二進制請求,如請求圖片。
經過TextHttpResponseHandler能夠發起返回結果爲字符串的請求,通常這個使用較多。
也可使用它的子類JsonHttpResponseHandler,返回結果是一個JSONObject或JSONArray。不過感受這個類做用不大,一是有另外一個類BaseJsonHttpResponseHandler,能夠直接解析返回的JSON數據,二是JsonHttpResponseHandler的方法太複雜了,有太多的onSuccess和onFailure方法,都不知道重寫哪一個了。
如上圖所示,每一個子類有太多的onSuccess和onFailure了,尤爲是JsonHttpResponseHandler,這應該算是這個類庫的不足吧。因此平時使用時基本不使用JsonHttpResponseHandler,而是直接使用TextHttpResponseHandler,固然也可使用BaseJsonHttpResponseHandler。
這個類庫還有一點不足,就是onSuccess等方法通常會在主線程執行,其實這麼說不嚴謹,看代碼吧:
public AsyncHttpResponseHandler() { boolean missingLooper = null == Looper.myLooper(); // Try to create handler if (!missingLooper) handler = new ResponderHandler(this); else { // There is no Looper on this thread so synchronous mode should be used. handler = null; setUseSynchronousMode(true); Log.i(LOG_TAG, "Current thread has not called Looper.prepare(). Forcing synchronous mode."); } // Init Looper by calling postRunnable without an argument. postRunnable(null); }
能夠看到,內部使用了Handler,當新建AsyncHttpResponseHandler的實例的時候會獲取當前線程的Looper,若是爲空就啓用同步模式,即全部的回調都會在執行請求的線程中執行,當在一個普通的後臺線程時這樣執行是正常的,而咱們通常都會在主線程發請請求,結果就是全部的回調都會在主線程中執行,這就限制了咱們在onSuccess中執行耗時操做,好比請求成功後將數據持久化到數據庫。
不過能夠看到建立Handler的時候使用了Looper對象,因此咱們就能夠改進一下其構造函數,添加一個Looper參數(同步修改子類),這樣全部的回調就都會在Looper所在線程執行,這樣咱們只須要開啓一個HandlerThread就好了。但這樣和Looper爲空時同樣有一個弊端,若是要更新UI操做的話,還須要向一個主線程的Handler發送消息讓UI更新。還有第二個弊端,全部回調都在同一個HandlerThread中執行,若是一個處理耗時過久會阻塞後面的請求結果處理,若是隻是簡單地寫個數據庫影響應該不大,若是真耗時過久,爲這個耗時處理再開個線程吧。