0410-AsyncHttpClient的简单使用

一、什么是AsyncHttpClient?

Android中网络请求一般使用Apache HTTP Client或者采用HttpURLConnect,但是直接使用这两个类库需要写大量的代码才能完成网络post和get请求,而使用android-async-http这个库可以大大的简化操作,它是基于Apache’s HttpClient ,所有的请求都是独立在UI主线程之外,通过回调方法处理请求结果,采用android Handler message 机制传递信息。

二、AsyncHttpClient的特性:

(1)采用异步http请求,并通过匿名内部类处理回调结果
(2)http请求独立在UI主线程之外
(3)采用线程池来处理并发请求
(4)采用RequestParams类创建GET/POST参数
(5)不需要第三方包即可支持Multipart file文件上传
(6)大小只有25kb
(7)自动为各种移动电话处理连接断开时请求重连
(8)超快的自动gzip响应解码支持
(9)使用BinaryHttpResponseHandler类下载二进制文件(如图片)
(10) 使用JsonHttpResponseHandler类可以自动将响应结果解析为json格式
(11)持久化cookie存储,可以将cookie保存到你的应用程序的SharedPreferences中

三、AsyncHttpClient的简单使用:

首先,在dependencies 下添加依赖:

dependencies {
  compile 'com.loopj.android:android-async-http:1.4.9'
}

1.不带参数使用get请求:
写一个HttpUtil类把这个方法封装起来:

AsyncHttpClient asyncHttpClient = new SyncHttpClient();
asyncHttpClient.get(BASE_URL, AsyncHttpClientRespenseHandler);

这样就完成了Get请求,BASE_URL是地址,AsyncHttpClientRespenseHandler是请求回调。

new AsyncHttpClientRespenseHandler() {

                                                       @Override
    public void onSuccess(int statusCode, Header[] headers, byte[] responseBody) {
        //请求成功
    }

    @Override
    public void onFailure(int statusCode, Header[] headers, byte[] responseBody, Throwable error) {
         //请求失败
    }
  }

2.带参数的get请求:
请求一个接口,在HttpUtil类中代码如下:
在一个程序中可能会遇到不同的接口,在这里,我们只需要将接口地址相同的部分封装起来,在请求的时候,将需要使用的对应的地址拼接即可;

public class HttpUtil {
    private static final String BASE_URL="http://103.244.59.105:8014/paopaoserver/";//接口相同地址
    private static AsyncHttpClient client=new AsyncHttpClient();
    public static void get(String url, RequestParams params, AsyncHttpResponseHandler responseHandler){
        client.get(getAbsoluteUrl(url),params,responseHandler);
    }
    private static String getAbsoluteUrl(String relation){
        return  BASE_URL+relation;
    }
}

在调用此方法请求数据出的代码如下:

     RequestParams params=new RequestParams();
     params.put("params","{\"page\":1,\"page_count\":10}");//需要请求数据的地址

                HttpUtil.get("articles", params, new TextHttpResponseHandler() {
                    @Override
                    public void onFailure(int statusCode, Header[] headers, String responseString, Throwable throwable) {
                        Toast.makeText(Main3Activity.this, "fail", Toast.LENGTH_SHORT).show();
                    }

                    @Override
                    public void onSuccess(int statusCode, Header[] headers, String responseString) {
                        Toast.makeText(Main3Activity.this, responseString, Toast.LENGTH_SHORT).show();
                    }
                });

RequestParams是我们写进去的参数。
RequestParams的用法:

       RequestParams requestParams=new RequestParams();
       requestParams.put("key", what);

这里是以键值对的方式存进去的。

3.不带参数的Post请求:

public class HttpUtil {
    private static final String BASE_URL="https://www.baidu.com/";
    private static AsyncHttpClient client=new AsyncHttpClient();
private static void post(MyHttpClientRespenseHandler myHttpClientRespenseHandler) {
        client.setTimeout(20000);
        client.post(BASE_URL, myHttpClientRespenseHandler);
    }
}

4.带参数的Post请求:
使用方法与带参数的get请求方式相同


public class HttpUtil {
    private static final String BASE_URL="http://103.244.59.105:8014/paopaoserver/";
    private static AsyncHttpClient client=new AsyncHttpClient();
    public static void post(String url, RequestParams params, AsyncHttpResponseHandler responseHandler) {
        client.post(getAbsoluteUrl(url), params, responseHandler);
    }

    private static String getAbsoluteUrl(String relation){
        return  BASE_URL+relation;
    }
}

使用post方法请求数据的代码如下:

RequestParams params=new RequestParams();
 params.put("params","{\"page\":1,\"page_count\":10}");
HttpUtil.post("articles", params, new TextHttpResponseHandler() {
                    @Override
                    public void onFailure(int statusCode, Header[] headers, String responseString, Throwable throwable) {

                    }

                    @Override
                    public void onSuccess(int statusCode, Header[] headers, String responseString) {
                        Toast.makeText(Main3Activity.this, responseString, Toast.LENGTH_SHORT).show();
                    }
                });

使用Post请求还是get请求要根据API接口文档的要求而定

5.使用JSON来请求数据方法:
在一个程序中可能会用到JSON来请求数据,使用方法代码如下:
首先,还是先封装:

public class HttpUtil {

    public static final String BASE_URL ="http://192.168.1.100:8890/type/jason/action/" ;
    private static AsyncHttpClient client=new AsyncHttpClient();
    public static void get(String url, RequestParams params, AsyncHttpResponseHandler responseHandler){
        client.get(getAbsoluteUrl(url),params,responseHandler);
    }
    public  static  void  post(Context context, String url, HttpEntity entity, String contentType, AsyncHttpResponseHandler responseHandler){
        client.post(context,url,entity, contentType,responseHandler);
    }

    private static String getAbsoluteUrl(String relation){
        return  BASE_URL+relation;
    }

}

请求数据的时候调用此方法:
首先定义一个JSONObject 对象放入需要解析的JSON键、值对
一个ByteArrayEntity对象,定义类型

 JSONObject object=new JSONObject();
        try {
            object.put("Blower",0);
        } catch (JSONException e) {
            e.printStackTrace();
        }
        ByteArrayEntity entity=null;
        try {
            entity=new ByteArrayEntity(object.toString().getBytes("UTF-8"));
            entity.setContentType(new BasicHeader(HTTP.CONTENT_TYPE,"application/json"));

        } catch (UnsupportedEncodingException e) {
            e.printStackTrace();
        }
        HttpUtil.post(mcontext, url+"control", entity, "application/json", new TextHttpResponseHandler() {
            @Override
            public void onFailure(int statusCode, Header[] headers, String responseString, Throwable throwable) {

            }

            @Override
            public void onSuccess(int statusCode, Header[] headers, String responseString) {
                number=0;
            }
        });
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值