Android网络请求库android-async-http使用

在 iOS开发中有大名鼎鼎的ASIHttpRequest库,用来处理网络请求操作,今天要介绍的是一个在Android上同样强大的网络请求库android-async-http,目前非常火的应用Instagram和Pinterest的Android版就是用的这个网络请求库。这个网络请求库是基于Apache HttpClient库之上的一个异步网络请求处理库,网络处理均基于Android的非UI线程,通过回调方法处理请求结果。
其主要特征如下:
处理异步Http请求,并通过匿名内部类处理回调结果
Http请求均位于非UI线程,不会阻塞UI操作
通过线程池处理并发请求
处理文件上传、 下载
响应结果自动打包JSON格式
自动处理连接断开时请求重连
使用android-async-http也非常简单,文章下面是下载jar地址,导入工程中libs文件夹下并添加到工程路径即可。通过下面的代码来创建一个异步请求:
?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
AsyncHttpClient client =  new AsyncHttpClient();   
                 client.get( "http://www.baidu.com" new AsyncHttpResponseHandler() {   
                         
                     @Override   
                     public void onSuccess(String response) {   
                         System.out.println(response);   
                         textView.setText(response);   
                     }   
                         
                     @Override   
                     public void onStart() {   
                         super .onStart();   
                         System.out.println( "onStart" );   
                     }   
                         
                     @Override   
                     public void onFinish() {   
                         super .onFinish();   
                         System.out.println( "onFinish" );   
                     }   
                         
                 }
通过Get请求指定的URL并通过回调函数处理请求结果,同时,请求方式还支持POST和PUT,请求的同时还支持参数传递,下面看看如何通过JSON字符串作为参数访问服务器:
?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
try {   
                     JSONObject jsonObject =  new JSONObject();   
                     jsonObject.put( "username" "ryantang" );   
                     StringEntity stringEntity =  new StringEntity(jsonObject.toString());   
                     client.post(MainActivity. this "http://api.com/login" , stringEntity,  "application/json" new JsonHttpResponseHandler(){   
     
                         @Override   
                         public void onSuccess(JSONObject jsonObject) {   
                             super .onSuccess(jsonObject);   
                                 
                         }   
                             
                     });   
                 catch (JSONException e) {   
                     e.printStackTrace();   
                 catch (UnsupportedEncodingException e) {   
                     e.printStackTrace();   
                 }

官方推荐的使用方法,使用一个静态的请求对象。
?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
public class HttpUtil { 
   
     private static AsyncHttpClient client =  new AsyncHttpClient();  // 实例话对象 
   
     static
   
         client.setTimeout( 10000 );  // 设置链接超时,如果不设置,默认为10s 
    
   
     // 用一个完整url获取一个string对象 
     public static void get(String urlString, AsyncHttpResponseHandler res)  
    
   
         client.get(urlString, res); 
   
    
   
     // url里面带参数 
     public static void get(String urlString, RequestParams params, 
             AsyncHttpResponseHandler res){ 
   
         client.get(urlString, params, res); 
   
    
   
     // 不带参数,获取json对象或者数组 
     public static void get(String urlString, JsonHttpResponseHandler res) { 
         client.get(urlString, res); 
   
    
   
     // 带参数,获取json对象或者数组 
     public static void get(String urlString, RequestParams params, 
             JsonHttpResponseHandler res) { 
   
         client.get(urlString, params, res); 
   
    
   
     // 下载数据使用,会返回byte数据 
     public static void get(String uString, BinaryHttpResponseHandler bHandler) { 
   
         client.get(uString, bHandler); 
   
    
   
     public static AsyncHttpClient getClient(){ 
   
         return client; 
    
   
}

下载:
?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
public void downloadClick(View view) { 
        String url =  "http://f.hiphotos.baidu.com/album/w%3D2048/sign=38c43ff7902397ddd6799f046dbab3b7/9c16fdfaaf51f3dee973bf7495eef01f3b2979d8.jpg"
        HttpUtil.get(url,  new BinaryHttpResponseHandler() { 
            @Override 
            public void onSuccess( byte [] arg0) { 
                super .onSuccess(arg0); 
                File file = Environment.getExternalStorageDirectory(); 
                File file2 =  new File(file,  "cat" ); 
                file2.mkdir(); 
                file2 =  new File(file2,  "cat.jpg" ); 
                try
                    FileOutputStream oStream =  new FileOutputStream(file2); 
                    oStream.write(arg0); 
                    oStream.flush(); 
                    oStream.close(); 
                    textView.setText( "可爱的猫咪已经保存在sdcard里面" ); 
                catch (Exception e) { 
                    e.printStackTrace(); 
                    Log.i( "hck" , e.toString()); 
               
           
        }); 
    }
上传:
?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
public void uploadClick(View view){ 
         String path= "http://10.0.2.2:8080/jsontest/servlet/UploadServlet"
         File myFile =  new File( "/sdcard/cat/cat.jpg" ); 
         RequestParams params =  new RequestParams(); 
         try
             params.put( "filename" , myFile); 
               
             AsyncHttpClient client =  new AsyncHttpClient(); 
             client.post(path, params,  new AsyncHttpResponseHandler(){ 
   
                 @Override 
                 public void onSuccess( int statusCode, String content) { 
                     // TODO Auto-generated method stub 
                     super .onSuccess(statusCode, content); 
                     Toast.makeText(MainActivity. this "上传成功!" , Toast.LENGTH_LONG).show(); 
                
                   
                   
             }); 
               
         catch (FileNotFoundException e) { 
               
        
     }


android-async-http (android-async-http-cached)是基于 Android Asynchronous HTTP Library (https://github.com/loopj/android-async-http)  实现。

1.增加响应数据本地缓存功能。
2.便于JSON-RPC,XML-RPC方式调用。  

用法:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
public class TestActivity  extends Activity {
  
     private static final int REQUEST_GET_ID =  0 ;
     private static final int REQUEST_POST_ID =  1 ;
     private static final int REQUEST_POST_JSON_ID =  2 ;
     private static final int REQUEST_POST_XML_ID =  3 ;
  
     private RequestManager mRequestManager;
  
     @Override
     protected void onCreate(Bundle savedInstanceState) {
         super .onCreate(savedInstanceState);
         this .mRequestManager = RequestManager
                 .getInstance(getApplicationContext());
  
         get();
         postParams();
         postJSONObject();
         postXML();
     }
  
     /**
      * get by url
      */
     private void get() {
         this .mRequestManager
                 .get( "http://app.shafa.com/api/push/download/52a093cf3bf55d361e000477?response-content-type=application%2fvnd.android.package-archive" ,
                         null , requestListener,  true , REQUEST_GET_ID);
     }
  
     /**
      * post by RequestParams
      */
     private void postParams() {
         final RequestParams params =  new RequestParams();
         params.put( "key1" "value1" );
         params.put( "key2" "value2" );
         this .mRequestManager.post( "http://server.winfirm.net/memoServer" ,
                 params, requestListener, REQUEST_POST_ID);
     }
  
     /**
      * post by JSONObject
      */
     private void postJSONObject() {
         final JSONObject json =  new JSONObject();
         try {
             json.put( "key1" "value1" );
             json.put( "key2" "value2" );
         catch (JSONException e) {
             e.printStackTrace();
         }
         this .mRequestManager.post( "http://server.winfirm.net/memoServer" , json,
                 requestListener, REQUEST_POST_JSON_ID);
     }
  
     /**
      * post by xml
      */
     private void postXML() {
         final String xml =  "<?xml version=\"1.0\" encoding=\"utf-8\"?><key1>value1</key1><key2>value2</key2>" ;
         this .mRequestManager.post( "http://server.winfirm.net/memoServer" , xml,
                 requestListener, REQUEST_POST_XML_ID);
     }
  
     /**
      * request listener
      */
     private RequestListener requestListener =  new RequestListener() {
         @Override
         public void onStart() {
  
         }
  
         @Override
         public void onCompleted( int statusCode,  byte [] data,
                 String description,  int actionId) {
             try {
                 System.out.println( new String(data,  "UTF-8" ));
             catch (Exception e) {
                 e.printStackTrace();
             }
             if (REQUEST_GET_ID == actionId) {
                 if (RequestListener.OK == statusCode) {
                     // sucess
                 else {
                     // handler error case
                 }
             else if (REQUEST_POST_ID == actionId) {
  
             else if (REQUEST_POST_JSON_ID == actionId) {
  
             else if (REQUEST_POST_XML_ID == actionId) {
  
             }
         }
  
         @Override
         public void onProgress( int bytesWritten,  int totalSize,  int actionId) {
             System.out.println(bytesWritten +  "/" + totalSize);
         }
     };
  
}

项目主页:http://www.open-open.com/lib/view/home/1426475044976



由于涉及网络请求,最后别忘了添加权限:

1
< uses-permission android:name = "android.permission.INTERNET" />





?
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值