Android中关于Volley的使用(四)利用NetworkImageView来加载图片

转载 2016年05月31日 20:20:46

文章转自http://blog.csdn.net/linmiansheng/article/details/21293699

在使用Volley来从网络获取图片的时候,我们前面介绍了ImageRequest的使用,而其实Volley还提供了一个NetworkImageView类。利用这个类,我们可以更有效率地去从网络去获取图片,因为它里面帮我们多设置了一个缓存,帮我们自己去处理请求的队列。

NetworkImageView类的具体使用方式如下:

1)在XML中定义:

  1. <FrameLayout  
  2.     android:id="@+id/flImageContainer"  
  3.     android:layout_width="match_parent"  
  4.     android:layout_height="wrap_content"  
  5.     android:layout_below="@+id/gvImages"  
  6.     android:layout_margin="30dp" >  
  7.   
  8.     <com.android.volley.toolbox.NetworkImageView  
  9.         android:id="@+id/nivTestView"  
  10.         android:layout_width="100dp"  
  11.         android:layout_height="100dp" >  
  12.     </com.android.volley.toolbox.NetworkImageView>  
  13. </FrameLayout>  

就相当于使用自定义的View,这里是com.Android.volley.toolbox.NetworkImageView。

2)然后在Activity中使用:

  1. networkImageView = (NetworkImageView) findViewById(R.id.nivTestView);  
  2.   
  3. mQueue = Volley.newRequestQueue(this);  
  4.   
  5. LruImageCache lruImageCache = LruImageCache.instance();  
  6.   
  7. ImageLoader imageLoader = new ImageLoader(mQueue,lruImageCache);  
  8.           
  9. networkImageView.setDefaultImageResId(R.drawable.ic_launcher);  
  10. networkImageView.setErrorImageResId(R.drawable.ic_launcher);          
  11. networkImageView.setImageUrl(URLS[1], imageLoader);  

第一步:我们还要创建一个RequestQueue。

第二步:我们要创建一个ImageLoader。

ImageLoader是NetworkImageView类中真正去跟网络打交道,获取图片的类,而在它的构造函数中,我们发现还需要去实现一个ImageCache接口的类,即上面的LruImageCache类,这是作为ImageLoader的内存缓存类,也就是通常所说的一级缓存了(L1)。

ImageCache是ImageLoader的内部接口,其定义如下:

  1. public interface ImageCache {  
  2.     public Bitmap getBitmap(String url);  
  3.     public void putBitmap(String url, Bitmap bitmap);  
  4. }  


所以在利用NetworkImageView之前,我们还需要先去实现这个接口,而Volley推荐的也就是LruCache,代码中的LruImageCache实现如下:
  1. package com.lms.volleydemo;  
  2.   
  3. import android.graphics.Bitmap;  
  4. import android.support.v4.util.LruCache;  
  5.   
  6. import com.android.volley.toolbox.ImageLoader.ImageCache;  
  7.   
  8. public class LruImageCache implements ImageCache{  
  9.   
  10.     private static LruCache<String, Bitmap> mMemoryCache;  
  11.       
  12.     private static LruImageCache lruImageCache;  
  13.       
  14.     private LruImageCache(){  
  15.         // Get the Max available memory  
  16.         int maxMemory = (int) Runtime.getRuntime().maxMemory();  
  17.         int cacheSize = maxMemory / 8;  
  18.         mMemoryCache = new LruCache<String, Bitmap>(cacheSize){  
  19.             @Override  
  20.             protected int sizeOf(String key, Bitmap bitmap){  
  21.                 return bitmap.getRowBytes() * bitmap.getHeight();  
  22.             }  
  23.         };        
  24.     }  
  25.       
  26.     public static LruImageCache instance(){  
  27.         if(lruImageCache == null){  
  28.             lruImageCache = new LruImageCache();  
  29.         }  
  30.         return lruImageCache;  
  31.     }  
  32.       
  33.     @Override  
  34.     public Bitmap getBitmap(String arg0) {        
  35.         return mMemoryCache.get(arg0);    
  36.     }  
  37.   
  38.     @Override  
  39.     public void putBitmap(String arg0, Bitmap arg1) {  
  40.         if(getBitmap(arg0) == null){  
  41.             mMemoryCache.put(arg0, arg1);  
  42.         }         
  43.     }  
  44.   
  45. }  

利用了 LruCache 来作为缓存,然后实现 ImageCache 的 getBitmap 和 putBitmap 方法。

然后将上面创建的 mQueue 和 LruImageCache 作为参数传递给其构造函数,这样 ImageLoader 对象就创建了。

第三步:调用 NetworkImageView 的 setImageUrl 方法,在这里,将 ImageLoader 传给它,然后就可以了。不过 Volley 推荐呢,在设置url之前,可以调用其以下两个方法:

  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. /** 
  10.  * Sets the error image resource ID to be used for this view in the event that the image 
  11.  * requested fails to load. 
  12.  */  
  13. public void setErrorImageResId(int errorImage) {  
  14.     mErrorImageId = errorImage;  
  15. }  

所以,我们在上面调用setImageUrl之前,也调用了这两个方法,其目的有两个:

1)调用 setDefaultImageResId,设置一个默认的图片显示,直到网络上的图片load完为止。

2)调用 setErrorImageResId,设置一个错误的图片,在网络加载过程中出错的时候展示。

下面我们来看看效果图:


上图中6个小图片呢,就是我们第一篇文章中利用ImageRequest来获取的网络图片了,而下面那一张稍大的,则是我们利用NetworkImageView来获取的图片了。

而除了在XML中定义,我们也可以直接在Java中动态创建,然后在Java中设置其url地址,其实我觉得这才是它最主要的用途,应该是用在展示大量网络图片的时候,效果会比较好。


Android中关于Volley的使用(四)利用NetworkImageView来加载图片

在使用Volley来从网络获取图片的时候,我们前面介绍了ImageRequest的使用,而其实Volley还提供了一个NetworkImageView类。利用这个类,我们可以更有效率地去从网络去获取图...
  • foolsheep
  • foolsheep
  • 2014年03月16日 00:01
  • 11210

Android结合volley的netWorkImageview实现图片文件缓存

在写Android应用程序时经常会用到图片缓存,对于网络请求使用Android平台上的网络通信库Volley,能使网络通信更快,更简单,更健壮,而且Volley特别适合数据量不大但是通信频繁的场景,所...
  • hqocshheqing
  • hqocshheqing
  • 2015年08月13日 11:20
  • 1852

Android-Volley网络通信框架(ImageRequest,ImageLoader,NetWorkImageView)

1.回顾    上篇已经学习了,RequestQueue  , StringRequest ,JsonObjectRequest 的使用 2.重点     (1)Volley请求图片的三种方式 ...
  • LABLENET
  • LABLENET
  • 2015年08月20日 12:25
  • 1676

Android Volley完全解析(二),使用Volley加载网络图片

在上一篇文章中,我们了解了Volley到底是什么,以及它的基本用法。本篇文章中我们即将学习关于Volley更加高级的用法,如何你还没有看过我的上一篇文章的话,建议先去阅读Android Volley完...
  • sinyu890807
  • sinyu890807
  • 2014年04月17日 09:23
  • 148059

在android中用NetworkImageView读取网络图片并通过ListView显示出来

在android中用Volley的NetworkImageView读取网络图片并通过ListView显示出来
  • coderK2014
  • coderK2014
  • 2016年06月13日 10:48
  • 2415

Volley框架中加载图片的3种方式

Volley框架中加载图片的3种方式
  • little_shengsheng
  • little_shengsheng
  • 2016年05月05日 16:47
  • 1060

Volley(二) ImageRequest、Imageloader、NetworkImageView加载图片

上一篇讲了一下Volley的基本用法 很简单的用法,有的人会说Volley加载图片怎么办呢   不用怕Volley自然会有的 好我们进入正题 StringRequest上一篇我们将完了 那Image...
  • qq_20607305
  • qq_20607305
  • 2015年09月07日 10:14
  • 677

Android之Volley框架加载网络图片的三种方式

1.第一种也是最常用的一种:ImageLoader public void imageLoader(String url,ImageView iv){ //ImageLoader的第一...
  • ygd1994
  • ygd1994
  • 2016年05月08日 23:18
  • 1111

android网络开源框架volley(四)——谈谈图片加载

加载图片,这个几乎每个app都会有所涉及,然后就是如果流畅加载,如何管理好内存,避免OOM之类。这些东西,机会是每个程序员必须面对的一些挑战。这里介绍下关于volley加载图片的用法。...
  • ttdevs
  • ttdevs
  • 2014年02月17日 11:08
  • 7652

Volley实现图片的网络下载

之前我们已经通过Volley从网络资源中下载东西了,纳闷
  • Sugar_tea
  • Sugar_tea
  • 2014年09月12日 21:20
  • 1016
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Android中关于Volley的使用(四)利用NetworkImageView来加载图片
举报原因:
原因补充:

(最多只允许输入30个字)