一、簡介
AsyncHttpClient是Android中處理異步Http的方法。
二、特征
- 使用版本4.3.6的上遊HttpClient而不是Android提供了DefaultHttpClient
- 相容Android API 23和更高版本
- 建立異步 HTTP請求,在匿名回調中處理響應
- HTTP請求發生在UI線程之外
- 請求使用線程池來限制并發資源使用
- GET / POST params builder(RequestParams)
- 多部分檔案上傳,無需額外的第三方庫
- 流式傳輸JSON,無需額外的庫
- 小尺寸開銷到您的應用程式,隻有90kb的一切
- 自動智能請求重試針對優質移動連接配接進行了優化
- 二進制協定與 BinaryHttpResponseHandler
- 内置響應解析到JSON 中JsonHttpResponseHandler
三、AsyncHttpClient的使用
使用AsyncHttpClient首先需要插入第三方的依賴庫
使用Gradle包下面的build.gradel中添加依賴庫
dependencies {
compile 'com.loopj.android:android-async-http:1.4.9'
}
AsyncHttpClient有兩種使用方法,一是寫一個内部方法使用,二是封裝AsyncHttpClient方法,通過調用來實作此方法
1、内部方法
//建立一個新AsyncHttpClient執行個體并送出請求
AsyncHttpClient client = new AsyncHttpClient();
//AsyncHttpClient中有get和post兩種方法
//第一個參數是所要擷取接口,第二個參數是所發出的請求
client.get("https://www.google.com", new TextHttpResponseHandler() {
@Override
public void onFailure(int statusCode, Header[] headers, String responseString, Throwable throwable) {
//用Toast顯示是否請求成功
Toast.makeText(ShoudongActivity.this,"通路失敗",Toast.LENGTH_SHORT).show();
}
@Override
public void onSuccess(int statusCode, Header[] headers, String responseString) {
Toast.makeText(ShoudongActivity.this,responseString,Toast.LENGTH_SHORT).show();
//列印擷取到的資訊
Log.e( "onSuccess: ", responseString+"+++++++++++++++++++++++++++++++++++");
}
});
2、建立一個類封裝AsyncHttpClient———推薦使用
由于在一個項目中使用的接口過多,如果在每一個類中都寫一個AsyncHttpClient方法,那麼就會使整個項目的代碼量過大,而且比較繁瑣,是以封裝一個AsyncHttpClient方法,在需要的時候調用會使代碼量減少
建立一個靜态的Http用戶端,先建立一個類來封裝AsyncHttpClient方法
public class HttpUtil {
//先定義一個String類型來接收接口相同的部分
private static final String BASE_URL = "http://192.168.1.101:8890/type/jason/action/";
//建立靜态的AsyncHttpClient
private static AsyncHttpClient client = new AsyncHttpClient();
//AsyncHttpClient中有get和post方法,需要用到public方法來修飾,以便調用
public static void get(String url, RequestParams params, AsyncHttpResponseHandler responseHandler){
client.get(getAbsoluteUrl(url), params, responseHandler);
}
//post方法中HttpEntity參數是後面發送JSON格式所用到的一個方法
public static void post(Context context,String url, HttpEntity entity, String contentType, AsyncHttpResponseHandler responseHandler) {
client.post(context,getAbsoluteUrl(url),entity, contentType, responseHandler);
}
//單獨寫一個方法添加URL
private static String getAbsoluteUrl(String url) {
return BASE_URL + url;
}
}
寫完了封裝AsyncHttpClient的方法類,那麼接下來就要調用了
//在RequestParams類用于可選的get或post參數添加
RequestParams params=new RequestParams();
//用鍵值對的輸出方式傳出,第一個參數是鍵,第二個參數是值
params.put("params","{\"classify_id\":70,\"page\":1,\"page_count\":2}");
//第二個參數是上面RequestParams傳來的參數
HttpUtil.get("getConfig", params, new TextHttpResponseHandler() {
@Override
public void onFailure(int statusCode, Header[] headers, String responseString, Throwable throwable) {
Toast.makeText(ShoudongActivity.this,"通路失敗",Toast.LENGTH_SHORT).show();
}
@Override
public void onSuccess(int statusCode, Header[] headers, String responseString) {
Toast.makeText(ShoudongActivity.this,responseString,Toast.LENGTH_SHORT).show();
Log.e( "onSuccess: ", responseString+"+++++++++++++++++++++++++++++++++++");
}
});
AsyncHttpClient的post方法發送JSON格式參數
用封裝的AsyncHttpClient
//定義json對象
JSONObject jsonObject=new JSONObject();
try {
//解析json資料
jsonObject.put("Blower", 1);
} catch (JSONException e) {
e.printStackTrace();
}
//封裝方法中post的參數
ByteArrayEntity entity = null;
try {
entity = new ByteArrayEntity(jsonObject.toString().getBytes("UTF-8"));
//用application/json向其傳達這是json類型的接口資料
entity.setContentType(new BasicHeader(HTTP.CONTENT_TYPE, "application/json"));
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
//封裝類.post發送資料
HttpUtil.post(CO2Activity.this, "control", entity, "application/json", new JsonHttpResponseHandler() {
@Override
public void onFailure(int statusCode, Header[] headers, Throwable throwable, JSONObject errorResponse) {
super.onFailure(statusCode, headers, throwable, errorResponse);
}
@Override
public void onSuccess(int statusCode, Header[] headers, JSONObject response) {
super.onSuccess(statusCode, headers, response);
}
});