天天看點

AsyncHttpClient類的講解

一、簡介

AsyncHttpClient是Android中處理異步Http的方法。

二、特征

  1. 使用版本4.3.6的上遊HttpClient而不是Android提供了DefaultHttpClient
  2. 相容Android API 23和更高版本
  3. 建立異步 HTTP請求,在匿名回調中處理響應
  4. HTTP請求發生在UI線程之外
  5. 請求使用線程池來限制并發資源使用
  6. GET / POST params builder(RequestParams)
  7. 多部分檔案上傳,無需額外的第三方庫
  8. 流式傳輸JSON,無需額外的庫
  9. 小尺寸開銷到您的應用程式,隻有90kb的一切
  10. 自動智能請求重試針對優質移動連接配接進行了優化
  11. 二進制協定與 BinaryHttpResponseHandler
  12. 内置響應解析到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);
     }
 });