Android 网络框架:android-async-http

jopen 9年前

1,Android Asynchronous Http Client简介

android-async-http是封装了HttpClient的顶层实现,它所发起的Request全部运行于不同于UI线程的其它线程中,但它回调的处理逻辑和使用Handler发送message处理的回调逻辑一样,你也可以将它运行在Service线程或者background线程中。

特点:

  • 异步HTTP请求,匿名回调响应函数
  • 在其他线程而非UI线程中发送Request
  • Requests使用线程池管理限制并发资源
  • 可以自定义GET/POST参数
  • 多种文件上传方式
  • JSON数据的上传
  • Request重试机制
  • 解析多种数据格式
  • 支持持久化存储Cookie
  • 支持SAX解析
  • 支持多种内容和语言编码格式,不仅仅是UTF-8

更多特性android-async-http

2,Android-async-http的使用

  1. 跟所有第三方库的使用一样,我们需要将其添加进我们的项目:可以直接下载最新.jar包( android-async-http.jar),也可以从github中将其clone到本地:android-async-http
    1. 如果是直接下载的.jar包,将其添加至项目libs文件夹下,并右键jar包,选择将其Add As Library:
    2. 如果是clone的项目,你还是需要将其编译成jar包,然后根据第1步操作添加进项目:以下是编译过程:
      首先进入你clone的android-async-http目录下,然后在命令行执行如下命令
    </li> </ol>
    android update project -p  ant jar 
    • 1
    • 2

    2.android-async-http的基本用法
    我们首选需要创建一个AsyncHttpClient实例,然后用它发起Request

    AsyncHttpClietn client=new AsyncHttpClient();      client.get("http://www.baidu.com",new AsyncHttpResponseHandler(){          @Override          public void onStart(){              //在Request发起前调用          }          @Override          public void onSuccess(int statusCode,Header[] headers,byte[] response){              //正确响应时调用,statusCode=200,headers代表响应http头部,response:响应返回值          }          @Override          public void onFailure(int statusCode,Header[] heards,byte[] errorResponse,Throwable e){              //未正确响应时调用:statusCode=401\403\404\...          }          @Override          public void onRetry(int retryNo){              //重试请求时调用            }        });

    推荐用法:创建 static Http Client;

    跟Volley框架一样,我们应该单独创建一个类,将我能需要的代码初始化,以便于全局持有某些对象。在这里将我们所需要的封装在一个static Client类中,可以根据自己的需求具体编写自定义Client类,具体的使用参考API: AsyncHttpClient, RequestParams and AsyncHttpResponseHandler

    public class MyCLient{          private static final String BASE_URL="http://www.baidu.com";            //创建一个static client          private static AsyncHttpClient client=new AsyncHttpClient();            //重写我们所需要的get,post等方法            public static get(String url,RequestParams params,AsyncHttpResonseHandler responseHand){              client.get(url,params,respnseHand)          }          public static post(String url,RequestParams params,aAsyncHttpResponseHandler responseHand){              client.post(url,params,responseHand);          }        }        //然后在需要的地方调用即可,      MyClient.get(url,params,new AsyncHttpResonseHandler(){...});

    3.Cookie的存储:通过使用PersistentCookieStore,它实现了HttpClient中CookieStore接口,自动将Cookie存储到本地SharedPerferences中,常用来存储用户登录信息等。
    AsyncHttpClient client=new AsyncHttpClient();        PersistentCookieStore cookieStore=new PersistentCookieStore(context);      client.setCookieStore(cookieStore);        //当然你也可以自己将Cookie添加存储到本地,先创建Cookie对象,然后通过addCookie()添加        BasicClientCookie myCookie=new BasicClientCOokie("cookieuser","hh");      myCookie.setViersion(1);      myCookie.setDomain("www.my.com");      myCookie.setPath("/");      client.addCookie(myCookie);

    4.为Request添加GET/POST参数:需要用到RequestParams类,
    创建方法有以下几种:
    RequestParams params=new RequestParams("username","coder");      //或者      RequestParams params=new RequestParams();      params.put("username","coder");      //也可以通过键值对Map对象添加      HashMap<String,String> map=new HashMap<String,String>();      map.put("username","coder");      RequestParams params=new RequestParams(map);        ....      //还记得前面写过的get(),post()方法吗,RequestParams即是它的第二个可选参数      client.get(url,params,new AsyncHttpResponseHandler(){..});

    5.通过RequestParams上传文件:上面我们知道了如何试着RequestParams,那么怎么才能上传一个文件呢,可以通过以下三种方式:

    通过输入流上传:

        InputStream myInputStream = blah;      RequestParams params = new RequestParams();      params.put("secret_passwords", myInputStream, “passwords.txt”);
    通过文件对象上传:
        File myFile = new File("/path/to/file.png");      RequestParams params = new RequestParams();      try {          params.put("profile_picture", myFile);      } catch(FileNotFoundException e) {}

    通过字节数组上传:

        byte[] myByteArray = blah;      RequestParams params = new RequestParams();      params.put("soundtrack", new ByteArrayInputStream(myByteArray), "she-wolf.mp3");

    6.下载二进制文件:通过FileAsyncHttpResponseHandler类可以下载图片等二进制文件

        AsyncHttpClient client=new AsyncHttpClient();      client.get("www.my.com/movies.jpg",new FileAsyncHttpResponseHandler(){          @Override          public void Success(int statusCode,Header[] headers,File response){              //获取文件          }      })

    那我们如何发送其他类型的例如Json请求呢,其实观察可以发现只需要:new JsonHttpResponseHandler(){..}

    7.HTTP身份验证Request:webservice中常需要进行身份验证,可通过以下两种方式实现:

        AsyncHttpClient client=new AsyncHttpClient();      //      client.setBasicAuth("username","password/token");      client.get("http://www.my.com");        //也可以设置更详细的验证范围      client.setBasicAuth("username","password",new AuthScope("www.my.com",80,AuthScope.ANY_REALM));      client.get("http://www.my.com");

    以上即android-async-http 框架的基本用法,不写具体的Demo了,更多内容参见官网提供的API:android-sync-http API

    总结:


    Android网络框架的学习就告一段落了,主要介绍了VolleyPicassoandroid-sync-http三种框架的使用,希望能对正在学习Android网络编程部分的同学有所帮助。

    在使用中,我们需要根据自己的需求和各个框架的特点选择自己所需的框架,初期我们掌握基本的使用就可以了,很多时候我们应该去试着研究它们的源码,这样才能在以后的开发中运用自如。

    其实几篇文章下来,我们可以发现开发中使用第三方框架基本上无非以下几步

    1. 根据自己的需求去github等网站寻求目前比较流行的框架;
    2. 熟悉你所选定框架的特点和使用场景以及缺陷
    3. 将对应jar包引入项目。
    4. 根据官方示例掌握基本用法。
    5. 多做练习,熟悉使用场景。
    6. 研究源码,改写框架以适应自己的需求。

    接下来准备写篇实战的文章,灵活运用以上所学框架我们实现一个简单APP,有兴趣的关注微博或公众号,随时更新~~

    参考资料:

    Android Asynchronous Http Client