標籤:
如果說我比別人看得更遠些,那是因為我站在了巨人的肩上。
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進行處理。
特性
- 非同步發送HTTP請求,在回呼函數中處理響應
- HTTP請求過程不在UI線程進行
- 使用線程池來管理並發數
- 支援GET/POST請求參數單獨設定
- 無需其他庫上傳序列化JSON資料
- 處理重新導向
- 體積小,只有90K
- 針對不同的網路連接對重試次數進行智能最佳化
- 支援gzip
- 二進位通訊協定使用BinaryHttpResponseHandler處理
- 內建Json解析,使用JsonHttpResponseHandler對響應進行處理
- 使用FileAsyncHttpResponseHandler直接將響應儲存到檔案中
- 動態儲存Cookie,將Cookie儲存到應用的SharedPreferences中
- 使用BaseJsonHttpResponseHandler可以搭配Jackson JSON,Gson或者其他的Json還原序列化庫
- 支援SAX解析,使用SaxAsyncHttpResponseHandler
- 支援多語言多種編碼方式,不只是UTF-8
主要類介紹
繼承自Runnabler,被submit至線程池執行網路請求並發送start,success等訊息
接收請求結果,一般重寫onSuccess及onFailure接收請求成功或失敗的訊息,還有onStart,onFinish等訊息
繼承自AsyncHttpResponseHandler,只是重寫了AsyncHttpResponseHandler的onSuccess和onFailure方法,將請求結果由byte數群組轉換為String
繼承自TextHttpResponseHandler,同樣是重寫onSuccess和onFailure方法,將請求結果由String轉換為JSONObject或JSONArray
- BaseJsonHttpResponseHandler
繼承自TextHttpResponseHandler,是一個泛型類,提供了parseResponse方法,子類需要提供實現,將請求結果解析成需要的類型,子類可以靈活地使用解析方法,可以直接原始解析,使用gson等。
請求參數,可以添加普通的字串參數,並可添加File,InputStream上傳檔案
核心類,使用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方法。
使用方法在官方網站寫的比較詳細,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用戶端