若是說我比別人看得更遠些,那是由於我站在了巨人的肩上。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
繼承自Runnabler,被submit至線程池執行網絡請求併發送start,success等消息
接收請求結果,通常重寫onSuccess及onFailure接收請求成功或失敗的消息,還有onStart,onFinish等消息
繼承自AsyncHttpResponseHandler,只是重寫了AsyncHttpResponseHandler的onSuccess和onFailure方法,將請求結果由byte數組轉換爲String
繼承自TextHttpResponseHandler,一樣是重寫onSuccess和onFailure方法,將請求結果由String轉換爲JSONObject或JSONArray
繼承自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操做 }
});
PS:若是須要上傳文件什麼的,直接RequestParams.put(key,value),支持多種數據格式,而後post便可。