Android開源庫--Asynchronous Http Client異步http客戶端

若是說我比別人看得更遠些,那是由於我站在了巨人的肩上。html

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

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

http通訊做爲開發android最基本的模塊,相信你們開發網絡應用時都會須要用到。github

在初學android的時候本身經過Apache的HttpClient類庫實現了一個簡單的http通訊模塊,線程安全,每次都要新建一個線程,經過Hander完成異步加載。json

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

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

介紹網絡

AHC是基於Apache的HttpClient 庫,全部的網絡請求過程在UI線程以外進行,而回調是在Handler裏面處理。也能夠再Service或者後臺程序裏面使用,這個庫會自動識別並在相應的Context進行處理。併發

特性app

  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操做 }
});

 PS:若是須要上傳文件什麼的,直接RequestParams.put(key,value),支持多種數據格式,而後post便可。

相關文章
相關標籤/搜索