频道栏目
首页 > 资讯 > Android > 正文

网络请求库之android-async-http

16-08-18        来源:[db:作者]  
收藏   我要投稿

Android中网络请求一般使用Apache HTTP Client或者采用HttpURLConnect,但是直接使用这两个类库需要写大量的代码才能完成网络post和get请求,而使用android-async-http这个库可以大大的简化操作,它是基于Apache’s HttpClient ,所有的请求都是独立在UI主线程之外,通过回调方法处理请求结果,采用android Handler message 机制传递信息。在 iOS开发中有大名鼎鼎的ASIHttpRequest库,用来处理网络请求操作,今天要介绍的是一个在Android上同样强大的网络请求库android-async-http(官方网址:https://loopj.com/android-async-http/),目前非常火的应用Instagram和Pinterest的Android版就是用的这个网络请求库。这个网络请求库是基于Apache HttpClient库之上的一个异步网络请求处理库,网络处理均基于Android的非UI线程,通过回调方法处理请求结果。

其主要特征如下:

处理异步Http请求,并通过匿名内部类处理回调结果Http请求均位于非UI线程,不会阻塞UI操作通过线程池处理并发请求处理文件上传、下载
采用RequestParams类创建GET/POST参数不需要第三方包即可支持Multipart file文件上传大小只有25kb自动为各种移动电话处理连接断开时请求重连超快的自动gzip响应解码支持使用BinaryHttpResponseHandler类下载二进制文件(如图片)使用JsonHttpResponseHandler类可以自动将响应结果解析为json格式持久化cookie存储,可以将cookie保存到你的应用程序的SharedPreferences中

android-async-http实现下载

添加依赖:

 

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

创建asyncHttpClient对象:

AsyncHttpClient asyncHttpClient= new AsyncHttpClient();

调用asyncHttpClient对象的get方法:

private void asyncGetMethod() {

        asyncHttpClient.get(url, new AsyncHttpResponseHandler() {//接收请求结果,一般重写onSuccess及onFailure接收请求成功或失败的消息,还有onStart,onFinish等消息
            @Override
            public void onSuccess(int statusCode, Header[] headers, byte[] responseBody) {
                // called when response HTTP status is "200 OK"
                if(statusCode==200){
//                Log.e("dy",new String(responseBody));
                    Bitmap bitmap = BitmapFactory.decodeByteArray(responseBody, 0, responseBody.length);
                    imageView.setImageBitmap(bitmap);//回调发生在创建它的线程中
                }
            }

            @Override
            public void onFailure(int statusCode, Header[] headers, byte[] responseBody, Throwable error) {
                // called when response HTTP status is "4XX" (eg. 401, 403, 404)
            }

        });
    }

记得不要忘记加上网络访问权限。

这样一个简单的网络访问请求就完成了。效果图如下:
 
callback发生在创建它的线程中,应用了Android的Handler发送消息机制。你也可以把AsyncHttpClient应用在Service中或者后台线程中,库代码会自动识别出它所运行的context。
当然你也可以通过RequestParams来传递各种参数。

 

private void asyncGetMethodWithParams() {
        params = new RequestParams();
        params.put("key","ce3ed11412e24cb9ac909a54ba8fbbd1");
        params.put("company","zhongtong");
        params.put("id","719235004847");
        asyncHttpClient.get(url2,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) {
                textView.setText(responseString);
            }
        });
    }

效果图:

 

TextHttpResponseHandler,其继承自AsyncHttpResponse,并将原生的字节流根据指定的encoding转化成了string对象。同样的方式,你可以发送json请求,代码如下:

 

private void sendJsonRequest() {
        params=new RequestParams();
        params.put("key","ce3ed11412e24cb9ac909a54ba8fbbd1");
        params.put("company","zhongtong");
        params.put("id","719235004847");
        asyncHttpClient.get(url2,params,new JsonHttpResponseHandler(){
            @Override
            public void onSuccess(int statusCode, Header[] headers, JSONObject response) {
                // Handle resulting parsed JSON response here
                try {
                    Log.e("dy",response.getString("result"));
                } catch (JSONException e) {
                    e.printStackTrace();
                }
            }

        });
    }

返回的response已经自动转化成JSONObject了,当然也支持JSONArray类型,override你需要的那个版本就行。android-async-http的基本用法就上面那些,另外,官方建议我们Make a Static Http Client,即写一个静态的httpClient对象,代码如下:

 

 

public class MyHttpClient {
    private static final String BASE_URL="http://api.avatardata.cn";
    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(String url,RequestParams params,AsyncHttpResponseHandler responseHandler){
        client.post(getAbsoluteUrl(url),params,responseHandler);
    }

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

private void staticHttpClient() {
        params=new RequestParams();
        params.put("key","ce3ed11412e24cb9ac909a54ba8fbbd1");
        params.put("company","zhongtong");
        params.put("id","719235004847");
        MyHttpClient.get(url2,params,new JsonHttpResponseHandler(){
            @Override
            public void onSuccess(int statusCode, Header[] headers, JSONObject response) {
                // If the response is JSONObject instead of expected JSONArray
                try {
                    String error = response.getString("result");
                    textView.setText(error);
                } catch (JSONException e) {
                    e.printStackTrace();
                }
            }
        });
    }

上述源码下载:源码

 

android-async-http实现上传

待续。。。

 

 

主要类介绍

AsyncHttpRequest 继承自Runnabler,被submit至线程池执行网络请求并发送start,success等消息
AsyncHttpResponseHandler 接收请求结果,一般重写onSuccess及onFailure接收请求成功或失败的消息,还有onStart,onFinish等消息
TextHttpResponseHandler 继承自AsyncHttpResponseHandler,只是重写了AsyncHttpResponseHandler的onSuccess和onFailure方法,将请求结果由byte数组转换为String
JsonHttpResponseHandler 继承自TextHttpResponseHandler,同样是重写onSuccess和onFailure方法,将请求结果由String转换为JSONObject或JSONArray
BaseJsonHttpResponseHandler 继承自TextHttpResponseHandler,是一个泛型类,提供了parseResponse方法,子类需要提供实现,将请求结果解析成需要的类型,子类可以灵活地使用解析方法,可以直接原始解析,使用gson等。
RequestParams 请求参数,可以添加普通的字符串参数,并可添加File,InputStream上传文件
AsyncHttpClient 核心类,使用HttpClient执行网络请求,提供了get,put,post,delete,head等请求方法,使用起来很简单,只需以url及RequestParams调用相应的方法即可,还可以选择性地传入Context,用于取消Content相关的请求,同时必须提供ResponseHandlerInterface(AsyncHttpResponseHandler继承自ResponseHandlerInterface)的实现类,一般为AsyncHttpResponseHandler的子类,AsyncHttpClient内部有一个线程池,当使用AsyncHttpClient执行网络请求时,最终都会调用sendRequest方法,在这个方法内部将请求参数封装成AsyncHttpRequest(继承自Runnable)交由内部的线程池执行。
SyncHttpClient 继承自AsyncHttpClient,同步执行网络请求,AsyncHttpClient把请求封装成AsyncHttpRequest后提交至线程池,SyncHttpClient把请求封装成AsyncHttpRequest后直接调用它的run方法。

请求流程:

 

调用AsyncHttpClient的get或post等方法发起网络请求所有的请求都走了sendRequest,在sendRequest中把请求封装为了AsyncHttpRequest,并添加到线程池执行当请求被执行时(即AsyncHttpRequest的run方法),执行AsyncHttpRequest的makeRequestWithRetries方法执行实际的请求,当请求失败时可以重试。并在请求开始,结束,成功或失败时向请求时传的ResponseHandlerInterface实例发送消息基本上使用的都是AsyncHttpResponseHandler的子类,调用其onStart,onSuccess等方法返回请求结果

其他说明

Android-Async-Http的使用非常简单,通过AsyncHttpClient发起请求就可以了,如果需要添加参数,直接传一个RequestParams过去,而且参数可以是String、File和InputStream,可以很方便地上传文件。 每个请求都需要传一个ResponseHandlerInterface的实例用以接收请求结果或请求失败,请求结束等通知,一般是AsyncHttpResponseHandler的子类。通过BinaryHttpResponseHandler可以发起二进制请求,如请求图片。通过TextHttpResponseHandler可以发起返回结果为字符串的请求,一般这个使用较多。
也可以使用它的子类JsonHttpResponseHandler,返回结果是一个JSONObject或JSONArray。不过感觉这个类作用不大,一是有另一个类BaseJsonHttpResponseHandler,可以直接解析返回的JSON数据,二是JsonHttpResponseHandler的方法太复杂了,有太多的onSuccess和onFailure方法,都不知道重写哪个了。
相关TAG标签
上一篇:Android 拍照或从相册取图片并裁剪
下一篇:Android 仿UC浏览器三点加载效果
相关文章
图文推荐

关于我们 | 联系我们 | 广告服务 | 投资合作 | 版权申明 | 在线帮助 | 网站地图 | 作品发布 | Vip技术培训 | 举报中心

版权所有: 红黑联盟--致力于做实用的IT技术学习网站