Android 快速開發架構網路篇-Android-Async-Http

來源:互聯網
上載者:User

標籤:

一、基本用法

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參數不對,此處只說明基本用法,詳細參數看源碼)

二、主要類介紹:

  • AsyncHttpRequest

    繼承自Runnabler,被submit至線程池執行網路請求並發送start,success等訊息

  • AsyncHttpResponseHandler

    接收請求結果,一般重寫onSuccess及onFailure接收請求成功或失敗的訊息,還有onStart,onFinish等訊息

  • TextHttpResponseHandler

    繼承自AsyncHttpResponseHandler,只是重寫了AsyncHttpResponseHandler的onSuccess和onFailure方法,將請求結果由byte數群組轉換為String

  • JsonHttpResponseHandler

    繼承自TextHttpResponseHandler,同樣是重寫onSuccess和onFailure方法,將請求結果由String轉換為JSONObject或JSONArray

  • BaseJsonHttpResponseHandler

    繼承自TextHttpResponseHandler,是一個泛型類,提供了parseResponse方法,子類需要提供實現,將請求結果解析成需要的類型,子類可以靈活地使用解析方法,可以直接原始解析,使用gson等。

  • RequestParams

    請求參數,可以添加普通的字串參數,並可添加File,InputStream上傳檔案

  • 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方法。

 

三、請求流程

  1. 調用AsyncHttpClient的get或post等方法發起網路請求
  2. 所有的請求都走了sendRequest,在sendRequest中把請求封裝為了AsyncHttpRequest,並添加到線程池執行
  3. 當請求被執行時(即AsyncHttpRequest的run方法),執行AsyncHttpRequest的makeRequestWithRetries方法執行實際的請求,當請求失敗時可以重試。並在請求開始,結束,成功或失敗時向請求時傳的ResponseHandlerInterface執行個體發送訊息
  4. 基本上使用的都是AsyncHttpResponseHandler的子類,調用其onStart,onSuccess等方法返回請求結果

第四、詳細使用方法

官方建議使用一個靜態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中執行,如果一個處理耗時太久會阻塞後面的請求結果處理,如果只是簡單地寫個資料庫影響應該不大,如果真耗時太久,為這個耗時處理再開個線程吧。

Android 快速開發架構網路篇-Android-Async-Http

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.