1.简介 Android中网络请求一般使用Apache HTTP Client或者采用HttpURLConnect,但是直接使用这两个类库需要写大量的代码才能完成网络post和get请求,而使用android-async-http这个库可以大大的简化操作,它是基于Apache’s HttpClient ,所有的请求都是独立在UI主线程之外,通过回调方法处理请求结果,采用android Handlermessage 机制传递信息。

2.特性
(1)采用异步http请求,并通过匿名内部类处理回调结果
(2)http请求独立在UI主线程之外
(3)采用线程池来处理并发请求
(4)采用RequestParams类创建GET/POST参数
(5)不需要第三方包即可支持Multipart file文件上传
(6)大小只有25kb
(7)自动为各种移动电话处理连接断开时请求重连
(8)超快的自动gzip响应解码支持
(9)使用BinaryHttpResponseHandler类下载二进制文件(如图片)
(10) 使用JsonHttpResponseHandler类可以自动将响应结果解析为json格式
(11)持久化cookie存储,可以将cookie保存到你的应用程序的SharedPreferences中

3.使用方法
(1)到官网http://loopj.com/android-async-http/下载最新的android-async-http-1.4.4.jar,然后将此jar包添加进Android应用程序 libs文件夹
(2)通过import com.loopj.android.http.*;引入相关类
(3)创建异步请求

[java] view plain copy
  1. AsyncHttpClientclient=newAsyncHttpClient();
  2. client.get("http://www.google.com",newAsyncHttpResponseHandler(){
  3. @Override
  4. publicvoidonSuccess(Stringresponse){
  5. System.out.println(response);
  6. }
  7. });

4.建议使用静态的Http Client对象
在下面这个例子,我们创建了静态的http client对象,使其很容易连接到Twitter的API
[java] view plain copy
  1. importcom.loopj.android.http.*;
  2. publicclassTwitterRestClient{
  3. privatestaticfinalStringBASE_URL="http://api.twitter.com/1/";
  4. privatestaticAsyncHttpClientclient=newAsyncHttpClient();
  5. publicstaticvoidget(Stringurl,RequestParamsparams,AsyncHttpResponseHandlerresponseHandler){
  6. client.get(getAbsoluteUrl(url),params,responseHandler);
  7. }
  8. publicstaticvoidpost(Stringurl,RequestParamsparams,AsyncHttpResponseHandlerresponseHandler){
  9. client.post(getAbsoluteUrl(url),params,responseHandler);
  10. }
  11. privatestaticStringgetAbsoluteUrl(StringrelativeUrl){
  12. returnBASE_URL+relativeUrl;
  13. }
  14. }
然后我们可以很容易的在代码中操作Twitter的API
[java] view plain copy
  1. importorg.json.*;
  2. importcom.loopj.android.http.*;
  3. classTwitterRestClientUsage{
  4. publicvoidgetPublicTimeline()throwsJSONException{
  5. TwitterRestClient.get("statuses/public_timeline.json",null,newJsonHttpResponseHandler(){
  6. @Override
  7. publicvoidonSuccess(JSONArraytimeline){
  8. //Pulloutthefirsteventonthepublictimeline
  9. JSONObjectfirstEvent=timeline.get(0);
  10. StringtweetText=firstEvent.getString("text");
  11. //Dosomethingwiththeresponse
  12. System.out.println(tweetText);
  13. }
  14. });
  15. }
  16. }

5. AsyncHttpClient, RequestParams ,AsyncHttpResponseHandler三个类使用方法

(1)AsyncHttpClient

public class AsyncHttpClient extends java.lang.Object
该类通常用在android应用程序中创建异步GET, POST, PUT和DELETE HTTP请求,请求参数通过RequestParams实例创建,响应通过重写匿名内部类 ResponseHandlerInterface的方法处理。
例子:
[java] view plain copy
  1. AsyncHttpClientclient=newAsyncHttpClient();
  2. client.get("http://www.google.com",newResponseHandlerInterface(){
  3. @Override
  4. publicvoidonSuccess(Stringresponse){
  5. System.out.println(response);
  6. }
  7. });
(2)RequestParams
public class RequestParams extends java.lang.Object
用于创建AsyncHttpClient实例中的请求参数(包括字符串或者文件)的集合
例子:
[java] view plain copy
  1. RequestParamsparams=newRequestParams();
  2. params.put("username","james");
  3. params.put("password","123456");
  4. params.put("email","[email protected]");
  5. params.put("profile_picture",newFile("pic.jpg"));//UploadaFile
  6. params.put("profile_picture2",someInputStream);//UploadanInputStream
  7. params.put("profile_picture3",newByteArrayInputStream(someBytes));//Uploadsomebytes
  8. Map<String,String>map=newHashMap<String,String>();
  9. map.put("first_name","James");
  10. map.put("last_name","Smith");
  11. params.put("user",map);//urlparams:"user[first_name]=James&user[last_name]=Smith"
  12. Set<String>set=newHashSet<String>();//unorderedcollection
  13. set.add("music");
  14. set.add("art");
  15. params.put("like",set);//urlparams:"like=music&like=art"
  16. List<String>list=newArrayList<String>();//Orderedcollection
  17. list.add("Java");
  18. list.add("C");
  19. params.put("languages",list);//urlparams:"languages[]=Java&languages[]=C"
  20. String[]colors={"blue","yellow"};//Orderedcollection
  21. params.put("colors",colors);//urlparams:"colors[]=blue&colors[]=yellow"
  22. List<Map<String,String>>listOfMaps=newArrayList<Map<String,String>>();
  23. Map<String,String>user1=newHashMap<String,String>();
  24. user1.put("age","30");
  25. user1.put("gender","male");
  26. Map<String,String>user2=newHashMap<String,String>();
  27. user2.put("age","25");
  28. user2.put("gender","female");
  29. listOfMaps.add(user1);
  30. listOfMaps.add(user2);
  31. params.put("users",listOfMaps);//urlparams:"users[][age]=30&users[][gender]=male&users[][age]=25&users[][gender]=female"
  32. AsyncHttpClientclient=newAsyncHttpClient();
  33. client.post("http://myendpoint.com",params,responseHandler);
(3)public class AsyncHttpResponseHandler extends java.lang.Object implements ResponseHandlerInterface
用于拦截和处理由AsyncHttpClient创建的请求。在匿名类AsyncHttpResponseHandler中的重写 onSuccess(int, org.apache.http.Header[], byte[])方法用于处理响应成功的请求。此外,你也可以重写 onFailure(int, org.apache.http.Header[], byte[], Throwable), onStart(), onFinish(), onRetry() 和onProgress(int, int)方法
例子:
[java] view plain copy
  1. AsyncHttpClientclient=newAsyncHttpClient();
  2. client.get("http://www.google.com",newAsyncHttpResponseHandler(){
  3. @Override
  4. publicvoidonStart(){
  5. //Initiatedtherequest
  6. }
  7. @Override
  8. publicvoidonSuccess(intstatusCode,Header[]headers,byte[]responseBody){
  9. //Successfullygotaresponse
  10. }
  11. @Override
  12. publicvoidonFailure(intstatusCode,Header[]headers,byte[]responseBody,Throwableerror)
  13. {
  14. //Responsefailed:(
  15. }
  16. @Override
  17. publicvoidonRetry(){
  18. //Requestwasretried
  19. }
  20. @Override
  21. publicvoidonProgress(intbytesWritten,inttotalSize){
  22. //Progressnotification
  23. }
  24. @Override
  25. publicvoidonFinish(){
  26. //Completedtherequest(eithersuccessorfailure)
  27. }
  28. });

6.利用PersistentCookieStore持久化存储cookie
PersistentCookieStore类用于实现Apache HttpClient的CookieStore接口,可以自动的将cookie保存到Android设备的SharedPreferences中,如果你打算使用cookie来管理验证会话,这个非常有用,因为用户可以保持登录状态,不管关闭还是重新打开你的app
(1)首先创建 AsyncHttpClient实例对象
[java] view plain copy
  1. AsyncHttpClientmyClient=newAsyncHttpClient();
(2)将客户端的cookie保存到PersistentCookieStore实例对象,带有activity或者应用程序context的构造方法
[java] view plain copy
  1. PersistentCookieStoremyCookieStore=newPersistentCookieStore(this);
  2. myClient.setCookieStore(myCookieStore);
(3)任何从服务器端获取的cookie都会持久化存储到myCookieStore中,添加一个cookie到存储中,只需要构造一个新的cookie对象,并且调用addCookie方法
[java] view plain copy
  1. BasicClientCookienewCookie=newBasicClientCookie("cookiesare","awesome");
  2. newCookie.setVersion(1);
  3. newCookie.setDomain("mydomain.com");
  4. newCookie.setPath("/");
  5. myCookieStore.addCookie(newCookie);

7.利用RequestParams上传文件
类RequestParams支持multipart file 文件上传
(1)在RequestParams 对象中添加InputStream用于上传
[java] view plain copy
  1. InputStreammyInputStream=blah;
  2. RequestParamsparams=newRequestParams();
  3. params.put("secret_passwords",myInputStream,"passwords.txt");
(2)添加文件对象用于上传
[java] view plain copy
  1. FilemyFile=newFile("/path/to/file.png");
  2. RequestParamsparams=newRequestParams();
  3. try{
  4. params.put("profile_picture",myFile);
  5. }catch(FileNotFoundExceptione){}
(3)添加字节数组用于上传
[java] view plain copy
  1. byte[]myByteArray=blah;
  2. RequestParamsparams=newRequestParams();
  3. params.put("soundtrack",newByteArrayInputStream(myByteArray),"she-wolf.mp3");

8.用BinaryHttpResponseHandler下载二进制数据
[java] view plain copy
  1. BinaryHttpResponseHandler用于获取二进制数据如图片和其他文件
  2. AsyncHttpClientclient=newAsyncHttpClient();
  3. String[]allowedContentTypes=newString[]{"image/png","image/jpeg"};
  4. client.get("http://example.com/file.png",newBinaryHttpResponseHandler(allowedContentTypes){
  5. @Override
  6. publicvoidonSuccess(byte[]fileData){
  7. //Dosomethingwiththefile
  8. }
  9. });
  10. ------------------------------------------------------------------------------------------

    android-async-http开源框架可以使我们轻松地获取网络数据或者向服务器发送数据,最关键的是,它是异步框架,在底层使用线程池处理并发请求,效率很高,使用又特别简单。

    以往我们在安卓上做项目,比如要下载很多图片、网页或者其他的资源,多数开发者会选择一个线程一个下载任务这种模型,因为安卓自带的 AndroidHttpClient 或者 java 带的 java.net.URL ,默认都是阻塞式操作。这种模型效率不高,对并发要求高的 APP 来讲,并不适用。有的人会选择使用 nio 自己实现,代码复杂度又很高。

    AsyncHttpClient 作为 android-async-http 框架的一个核心应用类,使用简单,可以处理文本、二进制等各种格式的 web 资源。下面提供一些代码来看如何使用:

    [java] view plain copy
    1. publicclassDownloader{
    2. publicstaticAsyncHttpClientmHttpc=newAsyncHttpClient();
    3. publicstaticStringTAG="Downloader";
    4. publicvoiddownloadText(Stringuri){
    5. mHttpc.get(uri,null,newAsyncHttpResponseHandler(){
    6. @Override
    7. publicvoidonSuccess(Stringdata){
    8. Log.i(TAG,"downloaded,threadid"+Thread.currentThread().getId());
    9. //TODO:dosomethingon
    10. }
    11. @Override
    12. publicvoidonFailure(Throwablee,Stringdata){
    13. Log.i(TAG,"downloadfailed.");
    14. //TODO:errorproceed
    15. }
    16. });
    17. }
    18. publicvoiddownloadImage(Stringuri,StringsavePath){
    19. mHttpc.get(uri,newImageResponseHandler(savePath));
    20. }
    21. publicclassImageResponseHandlerextendsBinaryHttpResponseHandler{
    22. privateStringmSavePath;
    23. publicImageResponseHandler(StringsavePath){
    24. super();
    25. mSavePath=savePath;
    26. }
    27. @Override
    28. publicvoidonSuccess(byte[]data){
    29. Log.i(TAG,"downloadimage,filelength"+data.length);
    30. //TODO:saveimage,dosomethingonimage
    31. }
    32. @Override
    33. publicvoidonFailure(Throwablee,Stringdata){
    34. Log.i(TAG,"downloadfailed");
    35. //TODO:errorproceed
    36. }
    37. }
    38. };

    上面的代码演示了如何使用AsyncHttpResponseHandler 和BinaryHttpResponseHandler ,相信 AsyncHttpClient 会给大家带来很大的便利。
AsyncHttpClient框架下载地址:http://loopj.com/android-async-http/

更多相关文章

  1. 修正AppCompatSpinner弹出框位置问题
  2. Android内容提供者使用及创建
  3. Android(安卓)Studio真机测试时生成的程序出现闪退
  4. # 读 Android(安卓)开发艺术探索 &8
  5. Android(安卓)10个快速开发框架:Afinal、ThinkAndroid、AndBase、
  6. Android学习路线(二十七)键值对(SharedPreferences)存储
  7. Android系统的启动流程
  8. Android界面刷新的方法
  9. Android(安卓)Intent 对象详解

随机推荐

  1. changeConfig配置 以及对activity生命周
  2. ListView从底部开始绘制和新item自动移动
  3. 【移动产品】ArcGIS Runtime SDK for And
  4. android wifi之 AsyncChannel类消息通道
  5. Cordova for android如何在App中处理退出
  6. ubuntu Android环境的搭建及其shell执行
  7. Android(安卓)自动化测试(6)
  8. Android笔记 - APK打包流程
  9. [Android]【安卓】【Java】Random(47)
  10. Android开发环境搭建-eclipse篇(真机测试