android-async-http的简单使用

在Android中为我们提供了两种Http请求方式:HttpURLConnection以及HttpClient。这两者可以帮助我们了解在Android中对HTTP请求的处理。但是一般实际开发中都是使用别人封装好的第三方网络请求框架,因为网络操作涉及到异步以及多线程,自己动手实现的话很麻烦。而这些第三方框架在优化上还更好。本文介绍其中一个框架:android-async-http的使用。
android-async-http介绍
查看官方文档:android-async-http
android-async-http是基于Apache HttpClient专门用于android的异步http请求,所有的请求都在非UI线程执行。API比较全面,使用比较简单,而且在CallBack中使用了Handler消息机制,我们可以在回调方法onSuccess,onFailure等中直接对UI进行操作。
功能

  • 用HttpClient代替Android提供的DefaultHttpClient;
  • 兼容Android API 23以及更高;
  • 发送异步http请求,在匿名的callback对象中处理response信息;
  • 在非UI线程执行http请求;
  • 使用线程池处理并发请求;
  • RequestParams作为GET/POST参数构造器;
  • 多部件文件上传,不需要引入第三方库;
  • JSON数据流上传,不需要引入库;
  • 能处理循环行和相对重定向;
  • 对应用来说库很小,总共只有90KB;
  • 使多种多样的移动连接具备良好自动智能请求重试机制;
  • 支持超快速请求的自动gzip响应解码;
  • BinaryHttpResponseHandler支持二进制通讯协议;
  • 通过JsonHttpResponseHandler实现内置解析response成JSON格式;
  • 通过FileAsyncHttpResponseHandler实现直接将response写入保存到文件中;
  • 持久化的cookie存储,将cookie保存到应用程序的SharePreferences中;
  • 通过BaseJsonHttpResponseHandler集成Jackson Json,Gson和其他的JSON序列化库;
  • 通过SaxAsyncHttpResponseHandler支持SAX解析;
  • 支持各种语言和内容编码,不是只有UTF-8;

使用步骤
在如图所示的文件中找到dependencies然后加上:
这里写图片描述

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

当然,你也可以选择从官网下载jar包,然后在工程中添加它。
然后,我们就可以使用这个框架了:

  1. 创建AsyncHttpClient对象
  2. 如果需要参数,可以创建RequestParams对象添加参数
  3. 按需要调用AsyncHttpClient的GET/POST方法,传递需要的回调接口实现。

    下面给出一个简单的例子:

public void UserLogin(String username,String password){
    AsyncHttpClient client=new AsyncHttpClient();//创建AsyncHttpClient对象
    String url="你要发起请求的url";
    RequestParams params=new RequestParams();//因为有参数,所以创建RequestParams对象
    params.put("un",username);//放入用户名
    params.put("pwd",password);//放入密码,根据需要,RequestParams对象还可以放入文件等。。
    client.post(url,params,new JsonHttpResponseHandler(){//向服务端发起post请求,根据服务端的返回信息,传入不同的回调接口实现,我这里因为服务端返回的是JSON数据所以使用 JsonHttpResponseHandler
        //重写onSuccess方法
        @Override
        public void onSuccess(int statusCode, cz.msebera.android.httpclient.Header[] headers, JSONObject response) {
            super.onSuccess(statusCode, headers, response);
            /*做你需要做的事,如更新UI等*/
            Toast.makeText(Login.this,"登录成功"+statusCode,Toast.LENGTH_SHORT).show();
        }
        //重写onFailure
       @Override
       public void onFailure(int statusCode, Header[] headers,Throwable throwable,JSONObject erroResponse) {
           super.onFailure(statusCode, headers, throwable, errorResponse);
           Toast.makeText(Login.this,"网络出错了"+statusCode,Toast.LENGTH_SHORT).show();
       }
   });
}

每次请求都需要传递一个实现ResponseHandlerInterface接口的实例,用来接收处理回调的事件,一般都继承AsyncHttpResponseHandler

1. AsyncHttpResponseHandler:

RequestParams params = new RequestParams();
                TestHttpClient.get(AsyncHttpActivity.this, url, params, new AsyncHttpResponseHandler() {
                    @Override
                    public void onSuccess(int statusCode, Header[] headers, byte[] responseBody) {

                    }

                    @Override
                    public void onFailure(int statusCode, Header[] headers, byte[] responseBody, Throwable error) {

                    }
                });

返回结果是byte类型的,可以转换成我们需要的格式。默认重写了onSuccess和onFailure两个方法,还可以重写onStart、onFinish、onCancle、onRetry等方法来实现数据的获取以及与界面的交互效果

2. BinaryHttpResponseHandler
继承AsyncHttpResponseHandler,可以发送二进制请求,如请求图片等,也是返回byte类型。

3. TextHttpResponseHandler
继承AsyncHttpResponseHandler,返回String类型。只重写了onSuccess和onFailure两个方法。

4. JsonHttpResponseHandler
继承TextHttpResponseHandler,只重写了onSuccess和onFailure两个方法。根据返回结果(JSONObject、JSONArray和String类型),调用不同的方法。

               RequestParams params = new RequestParams();
                TestHttpClient.get(AsyncHttpActivity.this, url, params, new JsonHttpResponseHandler(){
                    @Override
                    public void onSuccess(int statusCode, Header[] headers, JSONObject response) {
                        super.onSuccess(statusCode, headers, response);
                    }
                    @Override
                    public void onSuccess(int statusCode, Header[] headers, JSONArray response) {
                        super.onSuccess(statusCode, headers, response);
                    }
                    @Override
                    public void onSuccess(int statusCode, Header[] headers, String responseString) {
                        super.onSuccess(statusCode, headers, responseString);
                    }

                    @Override
                    public void onFailure(int statusCode, Header[] headers, String responseString, Throwable throwable) {
                        super.onFailure(statusCode, headers, responseString, throwable);
                    }
                    @Override
                    public void onFailure(int statusCode, Header[] headers, Throwable throwable, JSONObject errorResponse) {
                        super.onFailure(statusCode, headers, throwable, errorResponse);
                    }
                    @Override
                    public void onFailure(int statusCode, Header[] headers, Throwable throwable, JSONArray errorResponse) {
                        super.onFailure(statusCode, headers, throwable, errorResponse);
                    }
                });

5. BaseJsonHttpResponseHandler
继承自TextHttpResponseHandler,同样只重写了onSuccess、onFailure两个方法,另外添加了一个方法parseResponse。在AsyncHttpResponseHandler中onSuccess和onFailure通过handler消息机制的处理,可以直接在方法体中操作UI更新,但是在parseResponse方法中是不可以直接操作UI更新的。

                RequestParams params = new RequestParams();
                TestHttpClient.get(AsyncHttpActivity.this, url, params, new BaseJsonHttpResponseHandler<Object>() {
                    @Override
                    public void onSuccess(int statusCode, Header[] headers, String rawJsonResponse, Object response) {

                    }
                    @Override
                    public void onFailure(int statusCode, Header[] headers, Throwable throwable, String rawJsonData, Object errorResponse) {

                    }
                    @Override
                    protected Object parseResponse(String rawJsonData, boolean isFailure) throws Throwable {
                        return null;
                    }
                });

6. FileAsyncHttpResponseHandler,可以将response写入保存到文件中:

     RequestParams params = new RequestParams();
                TestHttpClient.get(AsyncHttpActivity.this, url, params, new FileAsyncHttpResponseHandler(AsyncHttpActivity.this) {
                    @Override
                    public void onFailure(int statusCode, Header[] headers, Throwable throwable, File file) {

                    }
                    @Override
                    public void onSuccess(int statusCode, Header[] headers, File file) {

                    }
                });

7. SaxAsyncHttpResponseHandler
继承自AsyncHttpResponseHandler,可以进行SAX解析。

这个框架还有许多功能,如Cookie持久化存储等,但是本人没有使用到,所以不做介绍。有兴趣可到官方文档中阅读。以上是本人在小项目中的一些使用经验,还有很多不足之处,还望指点。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值