Android開源庫--Asynchronous Http Client非同步http用戶端

來源:互聯網
上載者:User

標籤:

如果說我比別人看得更遠些,那是因為我站在了巨人的肩上。

github地址:https://github.com/loopj/android-async-http

Api文檔地址:http://loopj.com/android-async-http/doc/

http通訊作為開發android最基本的模組,相信大家開發網路應用時都會需要用到。

在初學android的時候自己通過Apache的HttpClient類庫實現了一個簡單的http通訊模組,安全執行緒,每次都要建立一個線程,通過Hander完成非同步載入。

後面通過github找到了這個類庫,原理也類似,也用的是Apache的HttpClient,而Android官方的類庫是HttpUrlConnection。

目前還沒有認真研究過源碼,設計封裝的很好,今天就主要介紹一下這個類庫。

介紹

AHC是基於Apache的HttpClient 庫,所有的網路請求過程在UI線程之外進行,而回調是在Handler裡面處理。也可以再Service或者背景程式裡面使用,這個庫會自動識別並在相應的Context進行處理。

特性

  1. 非同步發送HTTP請求,在回呼函數中處理響應
  2. HTTP請求過程不在UI線程進行
  3. 使用線程池來管理並發數
  4. 支援GET/POST請求參數單獨設定
  5. 無需其他庫上傳序列化JSON資料
  6. 處理重新導向
  7. 體積小,只有90K
  8. 針對不同的網路連接對重試次數進行智能最佳化
  9. 支援gzip
  10. 二進位通訊協定使用BinaryHttpResponseHandler處理
  11. 內建Json解析,使用JsonHttpResponseHandler對響應進行處理
  12. 使用FileAsyncHttpResponseHandler直接將響應儲存到檔案中
  13. 動態儲存Cookie,將Cookie儲存到應用的SharedPreferences中
  14. 使用BaseJsonHttpResponseHandler可以搭配Jackson JSON,Gson或者其他的Json還原序列化庫
  15. 支援SAX解析,使用SaxAsyncHttpResponseHandler
  16. 支援多語言多種編碼方式,不只是UTF-8
主要類介紹
  • 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方法。

 

使用方法在官方網站寫的比較詳細,demo裡面也有,大家看看就懂了

以上內容參考:

http://www.cnblogs.com/angeldevil/p/3729808.html

http://blog.csdn.net/qduningning/article/details/34829429

 

目前主流資料都是用REST模式,json格式通訊,因為我還是比較喜歡Gson(因為可以直接泛型轉換),JsonHttpResponseHandler用不習慣。在實際項目中我又自己封裝了一次,使用TextHttpResponseHandler擷取結果後,用Gson解析。

android-async-http的封裝

import com.loopj.android.http.AsyncHttpClient;import com.loopj.android.http.AsyncHttpResponseHandler;import com.loopj.android.http.RequestParams;public class RestHttpUtils {    private static AsyncHttpClient client = new AsyncHttpClient();    static {        client.addHeader("accept", "application/json");    }    public static void get(String url, RequestParams params, AsyncHttpResponseHandler responseHandler) {        client.get(url, params, responseHandler);    }    public static void get(String url, AsyncHttpResponseHandler responseHandler) {        client.get(url, null, responseHandler);    }    public interface RestHttpHandler<T> {        public  void onSuccess(T result);    }}

Gson的封裝

public class GsonUtils {    private static Gson _gson = new Gson();    public static <T> T parse(String json, Class<T> T) {        return _gson.fromJson(json, T);    }    public static <T> T parseList(String json, Type type) {        return _gson.fromJson(json, type);    }}

商務邏輯Controller

public class Controller {
public static void getDetail(final Context ctx, int id, final RestHttpHandler<Entity> handler) { RestHttpUtils.get(ApiUrls.getDetail() + "/id/" + id, new TextHttpResponseHandler() { @Override public void onFailure(int arg0, Header[] arg1, String arg2, Throwable arg3) { Toast.makeText(ctx, "擷取詳情失敗", Toast.LENGTH_SHORT).show(); } @Override public void onSuccess(int arg0, Header[] arg1, String arg2) { Entity result = GsonUtils.parse(arg2, Entity.class); handler.onSuccess(result); } }); }
}

具體使用

Controller.getDetail(DetailActivity.this, getIntent().getIntExtra("Id", 0),                new RestHttpHandler<Entity>() {                    @Override                    public void onSuccess(Entity result) {
              //擷取結果,進行一系列ui操作 }
});

 

Android開源庫--Asynchronous Http Client非同步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.