Android 网络框架:android-async-http

能帅
2023-12-01

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目录下,然后在命令行执行如下命令
android update project -p
ant jar

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. 研究源码,改写框架以适应自己的需求。
 类似资料: