zoukankan      html  css  js  c++  java
  • android-async-http AsyncHttpClient介绍

    前一阵子刚搬了家,加上公司要发新版本,所以一直比较忙,文章也好几周没更新了。难得这个周末有空,正好周内偶然间闲逛

     
    发现这个很不错的第三方开源类库,针对Android开发中发送http请求的。
     
      在Android开发中,发送、处理http请求简直太常见了,以至于我们的代码里到处充斥着各种HttpClient和与之相关又臭又长的代码,
     
    它们存在于你代码的各个角落,每次看见都令人作呕,而你仅仅是为了server能返回一个string或者json给你。每次当我自己写这样
     
    的代码时,我都会想能不能简化下这个流程,可能2、3行代码就能搞定。因为针对最简单的case,我只需要提供request url,成功时的
     
    callback和(或)失败时的callback,仅此而已。针对这一类问题(需求),可以说android-async-http提供了几乎完美的解决方案。
     
    通过使用它可以大大简化你的代码,不仅如此,你的代码看上去也优雅多了。
     
      当我第一眼看到它时就被吸引住了,特别是async关键字,干我们这行的都知道,这是异步执行,也就是说它的网络请求自动在非UI
     
    线程里执行,你不需要任何额外的操作(比如手动new一个Thread之类)。项目的官方网站:
     
    http://loopj.com/android-async-http/,对应的github地址:https://github.com/loopj/android-async-http
     
      我这里简要介绍下:它是专门针对Android在Apache的HttpClient基础上构建的异步的callback-based http client。所有的请求
     
    全在UI线程之外发生,而callback发生在创建它的线程中,应用了Android的Handler发送消息机制。你也可以把AsyncHttpClient应用在
     
    Service中或者后台线程中,库代码会自动识别出它所运行的context。它的feature包括:
     
    1. 发送异步http请求,在匿名callback对象中处理response;
     
    2. http请求发生在UI线程之外;
     
    3. 内部采用线程池来处理并发请求;
     
    4. GET/POST 参数构造,通过RequestParams类。
     
    5. 内置多部分文件上传,不需要第三方库支持;
     
    6. 流式Json上传,不需要额外的库;
     
    7. 能处理环行和相对重定向;
     
    8. 和你的app大小相比来说,库的size很小,所有的一切只有90kb;
     
    9. 自动智能的请求重试机制在各种各样的移动连接环境中;
     
    10. 自动的gzip响应解码;
     
    11. 内置多种形式的响应解析,有原生的字节流,string,json对象,甚至可以将response写到文件中;
     
    12. 永久的cookie保存,内部实现用的是Android的SharedPreferences;
     
    13. 通过BaseJsonHttpResponseHandler和各种json库集成;
     
    14. 支持SAX解析器;
     
    15. 支持各种语言和content编码,不仅仅是UTF-8。
     
    大概翻译了下,这些只是大体的概览,具体的细节还得在使用过程中慢慢感受、学习。
     
      接下来,带领大家看看应用android-async-http来写代码是个啥样子。简单来说你只需要3步,
     
    1. 创建一个AsyncHttpClient;
     
    2. (可选的)通过RequestParams对象设置请求参数;
     
    3. 调用AsyncHttpClient的某个get方法,传递你需要的(成功和失败时)callback接口实现,一般都是匿名内部类
     
    ,实现了AsyncHttpResponseHandler,类库自己也提供了好些现成的response handler,你一般不需要自己创建一个。
     
    来看看代码如何写:
     
    复制代码
    AsyncHttpClient client = new AsyncHttpClient();
    client.get("http://www.google.com", new AsyncHttpResponseHandler() {
     
        @Override
        public void onStart() {
            // called before request is started
        }
     
        @Override
        public void onSuccess(int statusCode, Header[] headers, byte[] response) {
            // called when response HTTP status is "200 OK"
        }
     
        @Override
        public void onFailure(int statusCode, Header[] headers, byte[] errorResponse, Throwable e) {
            // called when response HTTP status is "4XX" (eg. 401, 403, 404)
        }
     
        @Override
        public void onRetry(int retryNo) {
            // called when request is retried
        }
    });
    复制代码
    是不是很简洁,有没有被震撼到?反正我自己第一次看到的时候有种相见恨晚的感觉,这简直就是我日思夜想的方式啊!这里你只需要通过
     
    匿名内部类的方式实现AsyncHttpResponseHandler,而且更棒的是你只需要override感兴趣的方法,比如一般都是onSuccess和onFailure。
     
    这个版本的get方法没有为请求传递任何参数,当然你也可以通过RequestParams来传递各种参数,如下:
     
    复制代码
    AsyncHttpClient client = new AsyncHttpClient();
    RequestParams params = new RequestParams();
    params.put("key", "value");
    params.put("more", "data");
    client.get("http://www.google.com", params, new
        AsyncHttpResponseHandler() {
            @Override
            public void onSuccess(int statusCode, Header[] headers, byte[] response) {
                System.out.println(response);
            }
     
            @Override
            public void onFailure(int statusCode, Header[] headers, byte[] responseBody, Throwable error) {
                Log.d("ERROR", error);
            }    
        }
    );
    复制代码
    以上的例子是返回的response直接是原生字节流的情况,如果你需要把返回的结果当一个String对待,这时只需要匿名实现一个
     
    TextHttpResponseHandler就行,其继承自AsyncHttpResponse,并将原生的字节流根据指定的encoding转化成了string对象,
     
    代码如下:
     
    复制代码
    AsyncHttpClient client = new AsyncHttpClient();
    RequestParams params = new RequestParams();
    params.put("key", "value");
    params.put("more", "data");
    client.get("http://www.google.com", params, new
        TextHttpResponseHandler() {
            @Override
            public void onSuccess(int statusCode, Header[] headers, String response) {
                System.out.println(response);
            }
     
            @Override
            public void onFailure(int statusCode, Header[] headers, String responseBody, Throwable error) {
                Log.d("ERROR", error);
            }    
        }
    );
    复制代码
    同样的方式,你可以发送json请求,代码如下:
     
    复制代码
    String url = "https://ajax.googleapis.com/ajax/services/search/images";
    AsyncHttpClient client = new AsyncHttpClient();
    RequestParams params = new RequestParams();
    params.put("q", "android");
    params.put("rsz", "8");
    client.get(url, params, new JsonHttpResponseHandler() {            
        @Override
        public void onSuccess(int statusCode, Header[] headers, JSONObject response) {
           // Handle resulting parsed JSON response here
        }
        @Override
        public void onSuccess(int statusCode, Header[] headers, JSONArray response) {
          // Handle resulting parsed JSON response here
        }
    });
    复制代码
    看到了没,返回的response已经自动转化成JSONObject了,当然也支持JSONArray类型,override你需要的那个版本就行
  • 相关阅读:
    Lucene学习
    json-lib转化java对象,是否转化为null的属性
    maven项目导入war包
    服务器运维管理
    [ jquery 效果 delay(duration,[queueName]) ] 此方法用于对队列中的下一项的执行设置延迟
    [ jquery 效果 stop(stopAll,goToEnd) ] 此方法用于停止所有在指定元素上正在运行的动画,如果队列中有等待执行的动画(并且clearQueue没有设为true),他们将被马上执行
    [ css 过渡 transition ] transition新增过渡属性的实例演示
    [ css 动画 animation ] animation新增动画属性的实例演示
    [ css 过渡和动画 transition animation ] 过渡和动画听课笔记记录
    [ jquery 效果 animate(opation[speed,[easing],[fn]]) ] 此方法用于通过自定义调整目标的变化至指定目标来实现所有匹配元素的效果,并在动画完成后可选地触发一个回调函数
  • 原文地址:https://www.cnblogs.com/childhooding/p/4849648.html
Copyright © 2011-2022 走看看