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


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

    1、获取JSON对象

    1.1声明RequestQueue

    声明一个新的RequestQueue对象
    1. private RequestQueue mRequestQueue;  
     
    在onCreate初始化mRequestQueue
    1. mRequestQueue =  Volley.newRequestQueue(this);  

    1.2 声明并使用Request

    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做取消操作:

    1. @Override  
    2.    public void onStop() {  
    3.        for (Request <?> req : mRequestQueue) {  
    4.            req.cancel();  
    5.        }  
    6.    }  
     
    2)取消这个队列里的所有请求:

    1. @Override  
    2. protected void onStop() {  
    3.     // TODO Auto-generated method stub  
    4.     super.onStop();  
    5.     mRequestQueue.cancelAll(this);  
    6. }  

    3)可以根据RequestFilter或者Tag来终止某些请求
    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的一样。
    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.         }, 300, 200, 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).这两个方法足够简单直白,他们可以添加任何的缓存实现。

    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

    1. public class NetworkImageView extends ImageView  
    继承自ImageView,添加了一个
    1. public void setImageUrl(String url, ImageLoader imageLoader) {}  
    方法,参数包含一个Url地址和一个ImageLoader对象
    核心方法:
    1. private void loadImageIfNecessary(final boolean isInLayoutPass) {}  
    内部实现,boolean 类型参数代表是否重新请求网络 ,true:重新请求 false:取缓存
    内部实现和ImageLoader类似,都是通过ImageContainer中new一个ImageListener,在ImageListener,只是做了Url的空判断,如果Url为null,则调用ImageContainer.cancelRequest();取消请求。
    覆写方法:
     
    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个方法,设置开始下载的默认图和下载出错后显示图。
    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. }  

     
     
    /**
    * @author 张兴业
    *  iOS入门群:83702688
    *  android开发进阶群:241395671
    *  我的新浪微博:@张兴业TBOW
    */
     
  • 相关阅读:
    Python机器学习(五十一)SciPy 介绍
    Python机器学习(五十)NumPy 线性代数
    Python机器学习(四十九)NumPy 矩阵库函数
    Python机器学习(四十八)NumPy 副本和视图
    Python机器学习(四十七)NumPy 排序、查找、计数
    Python机器学习(四十六)NumPy 统计函数
    Python机器学习(四十五)NumPy 数学函数
    Python机器学习(四十四)NumPy 字符串函数
    Python机器学习(四十三)NumPy 位运算
    Python机器学习(四十二)NumPy 数组迭代
  • 原文地址:https://www.cnblogs.com/xgjblog/p/4180445.html
Copyright © 2020-2023  润新知