浅论Android网络请求库——android-async-http

浅论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也非常简单,到官网http://loopj.com/android-async-http/下载依赖jar包,导入工程中libs文件夹下并添加到工程路径即可。通过下面的代码来创建一个异步请求:
首先,我们分析一下相应核心的操作类。
AsyncHttpResponseHandler ——这是一个请求返回处理  成功 失败 开始  完成  等自定义的消息的类
 
BinaryHttpResponseHandler extends AsyncHttpResponseHandler ——继承AsyncHttpResponseHandler的子类,这是一个字节流返回处理的类, 该类用于处理图片等类。
 
JsonHttpResponseHandler extends AsyncHttpResponseHandler ——继承AsyncHttpResponseHandler的子类,这是一个json请求返回处理服务器与客户端用json交流时使用的类.
 
AsyncHttpRequest implements Runnable ——基于线程的子类,用于 异步请求类, 通过AsyncHttpResponseHandler回调。
 
PersistentCookieStore implements CookieStore ——这是一个基于CookieStore的子类, 使用HttpClient处理数据,并且使用cookie持久性存储接口。
 
 RequestParams ——封装了参数处理  例如:
 
复制代码

 RequestParams params = new RequestParams();
 params.put("username", "james");
 params.put("password", "123456");
 params.put("email", "my@email.com");
*params.put("profile_picture", new File("pic.jpg")); // Upload a File
*params.put("profile_picture2", someInputStream); // Upload an InputStream
 params.put("profile_picture3", new ByteArrayInputStream(someBytes)); // Upload some bytes

 AsyncHttpClient client = new AsyncHttpClient();


复制代码
接下来核心类。
 
RetryHandler implements HttpRequestRetryHandler——这是一个多个线程同步处理的类
 
SerializableCookie implements Serializable——这是操作cookie 放入/取出数据的类
 
SimpleMultipartEntity implements HttpEntity——用于处理多个请求实体封装
 
SyncHttpClient extends AsyncHttpClient——同步客户端请求的类
 
AsyncHttpClient——异步客户端请求的类
 
介绍了这些核心类之后,我们主要看看他的用法:
 
这是普通get方式来返回相应字符串的代码:
 
复制代码

 

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");  
                    }  
                      
                }  


复制代码
同时,请求方式还支持POST和PUT,请求的同时还支持参数传递,下面看看如何通过JSON字符串作为参数访问服务器:
 
复制代码
try {  
                    JSONObject jsonObject = new JSONObject();  
                    jsonObject.put("username", "ryantang");  
                    StringEntity stringEntity = new StringEntity(jsonObject.toString());  
                    client.post(MainActivity.this, "http://www.myhack58.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();  
                }  


复制代码
除此之外,还能够支持相应文件图片上传的话。相应的源代码如下:
 
复制代码
    String path=" http://www.myhack58.com/upload.action?&action=1.6&type=1&ext=png ";
        File myFile = new File("/sdcard/test.png");
        RequestParams params = new RequestParams();
        try {
 
            params.put("image", myFile,"application/octet-stream");
            
            AsyncHttpClient client = new AsyncHttpClient();
client.post(path, params, new AsyncHttpResponseHandler(){
                
                @Override
                public void onFailure(Throwable error, String content) {
                    // TODO Auto-generated method stub
                    super.onFailure(error, content);
                    Toast.makeText(MainActivity.this, "上传失败!"+content, Toast.LENGTH_LONG).show();
                }
                
                @Override
                public void onSuccess(int statusCode, String content) {
                    // TODO Auto-generated method stub
                    super.onSuccess(statusCode, content);
                    System.out
                            .println("content:    "+content);
                    Toast.makeText(MainActivity.this, "上传成功!"+content, Toast.LENGTH_LONG).show();
                }
                
                
            });
            
        } catch(FileNotFoundException e) {
            
        }


复制代码
注意了,这种方法上传的参数一定要 设置params.put("image", myFile,"application/octet-stream");否则就会失败。
 
当然,android-async-http还有很多用法,这里不做过多赘述了。希望android-async-http能够大家以后android的请求模块得到帮助。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值