网络通信框架Volley使用详细说明

前一篇粗略的介绍了一下Volley,并在最后附上了一段使用代码,这一篇详细的介绍一下Volley的使用。前面也说了Volley主要获取JSON对象和图片加载,这里也分为两部分介绍。

1、获取JSON对象

1.1声明RequestQueue

声明一个新的RequestQueue对象
[java]  view plain copy print ?
  1. private RequestQueue mRequestQueue;  
 
onCreate初始化mRequestQueue
[java]  view plain copy print ?
  1. mRequestQueue =  Volley.newRequestQueue(this);  

1.2 声明并使用Request

[java]  view plain copy print ?
  1. JsonObjectRequest jr = new JsonObjectRequest(Request.Method.GET,url,null,new Response.Listener<JSONObject>() {  
  2.             @Override  
  3.             public void onResponse(JSONObject response) {  
  4.                 Log.i(TAG,response.toString());  
  5.                 parseJSON(response);  
  6.                 va.notifyDataSetChanged();  
  7.                 pd.dismiss();  
  8.             }  
  9.         },new Response.ErrorListener() {  
  10.             @Override  
  11.             public void onErrorResponse(VolleyError error) {  
  12.                 Log.i(TAG,error.getMessage());  
  13.             }  
  14.         });  
  15.         mRequestQueue.add(jr);  


Volley提供了JsonObjectRequest、JsonArrayRequest、StringRequest等Request形式。

JsonObjectRequest:返回JSON对象。

JsonArrayRequest:返回JsonArray。

StringRequest:返回String,这样可以自己处理数据,更加灵活。

另外可以继承Request<T>自定义Request。


1.3 取消Request

      Activity里面启动了网络请求,而在这个网络请求还没返回结果的时候,Activity被结束了,此时 如果继续使用其中的Context等,除了无辜的浪费CPU,电池,网络等资源,有可能还会导致程序crash,所以,我们需要处理这种一场情况。使用Volley的话,我们可以在Activity停止的时候,同时取消所有或部分未完成的网络请求。Volley里所有的请求结果会返回给主进程,如果在主进程里取消了某些请求,则这些请求将不会被返回给主线程。Volley支持多种request取消方式。
1)可以针对某些个request做取消操作:


[java]  view plain copy print ?
  1. @Override  
  2.    public void onStop() {  
  3.        for (Request <?> req : mRequestQueue) {  
  4.            req.cancel();  
  5.        }  
  6.    }  

2)取消这个队列里的所有请求:

[java]  view plain copy print ?
  1. @Override  
  2. protected void onStop() {  
  3.     // TODO Auto-generated method stub  
  4.     super.onStop();  
  5.     mRequestQueue.cancelAll(this);  
  6. }  

3)可以根据RequestFilter或者Tag来终止某些请求
[java]  view plain copy print ?
  1. @Override  
  2. rotected void onStop() {  
  3. // TODO Auto-generated method stub  
  4. super.onStop();  
  5.   
  6. mRequestQueue.cancelAll( new RequestFilter() {});  
  7. or  
  8. mRequestQueue.cancelAll(new Object());  
  9.   
  10.    


Volley支持http的GET、POST、PUT、DELETE等方法,上面给出了GET方法,其他方法请参考



2、图片加载

2.1使用ImageRequest下载图片

    Volley提供了多种Request方法,ImageRequest能够处理单张图片,返回bitmap。下面是ImageRequest的使用例子,和JsonRequest的一样。
[java]  view plain copy print ?
  1. singleImg=(ImageView)findViewById(R.id.volley_img_single_imgeview);  
  2.         ImageRequest imgRequest=new ImageRequest(url, new Response.Listener<Bitmap>() {  
  3.             @Override  
  4.             public void onResponse(Bitmap arg0) {  
  5.                 // TODO Auto-generated method stub  
  6.                 singleImg.setImageBitmap(arg0);  
  7.             }  
  8.         }, 300200, Config.ARGB_8888, new ErrorListener(){  
  9.             @Override  
  10.             public void onErrorResponse(VolleyError arg0) {  
  11.                 // TODO Auto-generated method stub  
  12.                   
  13.             }             
  14.         });  
  15.         mRequestQueue.add(imgRequest);  


2.2使用ImageLoader

    ImageLoader这个类需要一个Request的实例以及一个ImageCache的实例。图片通过一个URL和一个ImageListener实例的get()方法就可以被加载。从哪里,ImageLoader会检查ImageCache,而且如果缓存里没有图片就会从网络上获取。

    Volley的ImageCache接口允许你使用你喜欢的L1缓存实现。不幸的是Volley没有提供默认的实现。在I/O的介绍中展示了BitmapLruCache的一点代码片段,但是Volley这个库本身并不包含任何相关的实现。

    ImageCache接口有两个方法,getBitmap(String url)和putBitmap(String url, Bitmap bitmap).这两个方法足够简单直白,他们可以添加任何的缓存实现。

[java]  view plain copy print ?
  1. RequestQueue mRequestQueue = Volley.newRequestQueue(this);  
  2.         final LruCache<String, Bitmap> mImageCache = new LruCache<String, Bitmap>(  
  3.                 20);  
  4.         ImageCache imageCache = new ImageCache() {  
  5.             @Override  
  6.             public void putBitmap(String key, Bitmap value) {  
  7.                 mImageCache.put(key, value);  
  8.             }  
  9.   
  10.             @Override  
  11.             public Bitmap getBitmap(String key) {  
  12.                 return mImageCache.get(key);  
  13.             }  
  14.         };  
  15.         ImageLoader mImageLoader = new ImageLoader(mRequestQueue, imageCache);  
  16.         // imageView是一个ImageView实例  
  17.         // ImageLoader.getImageListener的第二个参数是默认的图片resource id  
  18.         // 第三个参数是请求失败时候的资源id,可以指定为0  
  19.         ImageListener listener = ImageLoader  
  20.                 .getImageListener(imageView, android.R.drawable.ic_menu_rotate,  
  21.                         android.R.drawable.ic_delete);  
  22.         mImageLoader.get(url, listener);  


2.3 使用NetworkImageView


[java]  view plain copy print ?
  1. public class NetworkImageView extends ImageView  
继承自ImageView,添加了一个
[java]  view plain copy print ?
  1. public void setImageUrl(String url, ImageLoader imageLoader) {}  
方法,参数包含一个Url地址和一个ImageLoader对象
核心方法:
[java]  view plain copy print ?
  1. private void loadImageIfNecessary(final boolean isInLayoutPass) {}  
内部实现,boolean 类型参数代表是否重新请求网络 ,true:重新请求 false:取缓存
内部实现和ImageLoader类似,都是通过ImageContainer中new一个ImageListener,在ImageListener,只是做了Url的空判断,如果Url为null,则调用ImageContainer.cancelRequest();取消请求。
覆写方法:
 
[java]  view plain copy print ?
  1. @Override  
  2. protected void onLayout(boolean changed, int left, int top, int right, int bottom) {  
  3. super.onLayout(changed, left, top, right, bottom);  
  4. //onLayout时重新请求  
  5. loadImageIfNecessary(true);  
  6. }  
  7. @Override  
  8. protected void onDetachedFromWindow() {  
  9. //销毁View的时候Release操作  
  10. if (mImageContainer != null) {  
  11. // If the view was bound to an image request, cancel it and clear  
  12. // out the image from the view.  
  13. mImageContainer.cancelRequest();  
  14. setImageBitmap(null);  
  15. // also clear out the container so we can reload the image if necessary.  
  16. mImageContainer = null;  
  17. }  
  18. super.onDetachedFromWindow();  
  19. }  
  20. //drawable状态改变重绘  
  21. @Override  
  22. protected void drawableStateChanged() {  
  23. super.drawableStateChanged();  
  24. invalidate();  
  25. }  


    总结:网络请求下载图片显示,可以使用此控件,比传统的ImageView多了网络处理,也添加了2个方法,设置开始下载的默认图和下载出错后显示图。

[java]  view plain copy print ?
  1. /** 
  2. * Sets the default image resource ID to be used for this view until the attempt to load it 
  3. * completes. 
  4. */  
  5. public void setDefaultImageResId(int defaultImage) {  
  6. mDefaultImageId = defaultImage;  
  7. }  
  8. /** 
  9. * Sets the error image resource ID to be used for this view in the event that the image 
  10. * requested fails to load. 
  11. */  
  12. public void setErrorImageResId(int errorImage) {  
  13. mErrorImageId = errorImage;  
  14. }  
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
对于Android网络框架的封装,有许多不同的选择。以下是一些常见的网络框架和封装方法: 1. VolleyVolley是Google推出的用于Android应用程序的网络通信库。它使用简单且易于集成,具有高效的网络请求队列和缓存机制。你可以封装Volley以满足你的特定需求,例如添加身份验证、错误处理或数据解析等功能。 2. OkHttp:OkHttp是一个开源的HTTP客户端库,可用于Android应用程序中的网络通信。它提供了简单易用的API,支持同步和异步请求,并具有连接池和缓存等功能。你可以使用OkHttp封装网络请求,自定义拦截器和事件监听器,以及处理各类错误和异常情况。 3. Retrofit:Retrofit是Square公司开发的一个类型安全的RESTful网络请求库。它基于OkHttp,并提供了简洁的注解接口来定义API请求。你可以封装Retrofit以定义你的API接口和请求参数,并处理响应结果、错误情况和数据解析等。 4. 自定义封装:除了使用现有的网络框架,你还可以根据你的需求自定义封装一个网络库。这种方式可以灵活地满足特定的业务需求。你可以使用Java的URLConnection或Apache HttpClient等原生库进行底层网络通信,并自定义请求、解析和错误处理等逻辑。 在封装网络框架时,你可以考虑以下几点: - 封装请求方法(GET、POST等)和参数(URL、请求头、请求体等)的接口。 - 统一处理错误和异常情况,例如网络连接失败、超时、服务器错误等。 - 可选地处理数据解析和转换,例如使用Gson库将JSON数据转换为Java对象。 - 支持并发请求和线程管理,以避免阻塞主线程。 - 可选地添加缓存机制,以减少重复请求和提高性能。 - 可选地添加身份验证和安全机制,以保护数据的传输和存储安全。 以上是一些常见的Android网络框架封装方法,你可以根据具体需求选择适合你项目的框架或自定义封装。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值