您的位置:首页 > 移动开发 > Android开发

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

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

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

1)在XML中定义:

[java] view
plaincopy





<FrameLayout

android:id="@+id/flImageContainer"

android:layout_width="match_parent"

android:layout_height="wrap_content"

android:layout_below="@+id/gvImages"

android:layout_margin="30dp" >

<com.android.volley.toolbox.NetworkImageView

android:id="@+id/nivTestView"

android:layout_width="100dp"

android:layout_height="100dp" >

</com.android.volley.toolbox.NetworkImageView>

</FrameLayout>

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

2)然后在Activity中使用:

[java] view
plaincopy





networkImageView = (NetworkImageView) findViewById(R.id.nivTestView);

mQueue = Volley.newRequestQueue(this);

LruImageCache lruImageCache = LruImageCache.instance();

ImageLoader imageLoader = new ImageLoader(mQueue,lruImageCache);

networkImageView.setDefaultImageResId(R.drawable.ic_launcher);

networkImageView.setErrorImageResId(R.drawable.ic_launcher);

networkImageView.setImageUrl(URLS[1], imageLoader);

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

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

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

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

[java] view
plaincopy





public interface ImageCache {

public Bitmap getBitmap(String url);

public void putBitmap(String url, Bitmap bitmap);

}

所以在利用NetworkImageView之前,我们还需要先去实现这个接口,而Volley推荐的也就是LruCache,代码中的LruImageCache实现如下:

[java] view
plaincopy





package com.lms.volleydemo;

import android.graphics.Bitmap;

import android.support.v4.util.LruCache;

import com.android.volley.toolbox.ImageLoader.ImageCache;

public class LruImageCache implements ImageCache{

private static LruCache<String, Bitmap> mMemoryCache;

private static LruImageCache lruImageCache;

private LruImageCache(){

// Get the Max available memory

int maxMemory = (int) Runtime.getRuntime().maxMemory();

int cacheSize = maxMemory / 8;

mMemoryCache = new LruCache<String, Bitmap>(cacheSize){

@Override

protected int sizeOf(String key, Bitmap bitmap){

return bitmap.getRowBytes() * bitmap.getHeight();

}

};

}

public static LruImageCache instance(){

if(lruImageCache == null){

lruImageCache = new LruImageCache();

}

return lruImageCache;

}

@Override

public Bitmap getBitmap(String arg0) {

return mMemoryCache.get(arg0);

}

@Override

public void putBitmap(String arg0, Bitmap arg1) {

if(getBitmap(arg0) == null){

mMemoryCache.put(arg0, arg1);

}

}

}

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

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

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

[java] view
plaincopy





/**

* Sets the default image resource ID to be used for this view until the attempt to load it

* completes.

*/

public void setDefaultImageResId(int defaultImage) {

mDefaultImageId = defaultImage;

}

/**

* Sets the error image resource ID to be used for this view in the event that the image

* requested fails to load.

*/

public void setErrorImageResId(int errorImage) {

mErrorImageId = errorImage;

}

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

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

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

下面我们来看看效果图:



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

而除了在XML中定义,我们也可以直接在Java中动态创建,然后在Java中设置其url地址,其实我觉得这才是它最主要的用途,应该是用在展示大量网络图片的时候,效果会比较好。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: