在ListView中列表显示图片时,当图片分页加载到最低端时,如果再向上滑动,会有图片闪烁的情况,引起的原因一般是因为没引入缓存,当上下滑动的时候,每个Item需要重新加载图片导致图片的闪烁,使用Volley的三级缓存机制,能很容易的解决此问题!
初始化Volley请求队列:
//实例化Volley请求队列
RequestQueue queue = Volley.newRequestQueue(context);
传入要显示的ImageView控件
//使用Volley的缓存机制,三级缓存,磁盘,内存,网络
ImageLoader imageLoader = new ImageLoader(queue,
MyImageCache.getMyImageCache());
imageLoader.get(mGoodsBenn.getGoodsUrl(), // url
ImageLoader.getImageListener(viewHolder.image,// imageview控件
R.drawable.ic_launcher,// 等待下载的图片
R.drawable.ic_launcher),// 网络异常的图片
100, 80// 二次采样的大小
);
自定义的缓存工具类MyImageCache.java
package com.zhuandian.qxe.ResideMenuDemo.utils;
import android.graphics.Bitmap;
import android.util.LruCache;
import com.android.volley.toolbox.ImageLoader.ImageCache;
import java.lang.ref.SoftReference;
import java.util.HashMap;
import java.util.Map;
public class MyImageCache implements ImageCache {
private static MyImageCache myImageCache=null;
public static MyImageCache getMyImageCache(){
if(myImageCache==null){
myImageCache=new MyImageCache();
}
return myImageCache;
}
private MyImageCache(){
}
private MyLruCache myLruCache = new MyLruCache((int) (Runtime.getRuntime()
.maxMemory() / 8));
private Map<String, SoftReference<Bitmap>> map = new HashMap<String, SoftReference<Bitmap>>();
// 它是loader获取bitmap的方法
// 如果返回null,volley就去磁盘上自己去找,如果没找到,他自己又去网络上找
@Override
public Bitmap getBitmap(String url) {
// TODO Auto-generated method stub
Bitmap bitmap = null;
bitmap = myLruCache.get(url);
if (bitmap != null) {
return bitmap;
} else {
SoftReference<Bitmap> softbitmap = map.get(url);
if (softbitmap != null) {
bitmap = softbitmap.get();
if (bitmap != null) {
myLruCache.put(url, bitmap);
return bitmap;
}
}
}
return null;
}
// volley从磁盘或者网络上寻找到了bitmap就会回调这个方法
@Override
public void putBitmap(String url, Bitmap bitmap) {
// TODO Auto-generated method stub
myLruCache.put(url, bitmap);
}
class MyLruCache extends LruCache<String, Bitmap> {
public MyLruCache(int maxSize) {
super(maxSize);
// TODO Auto-generated constructor stub
}
@Override
protected int sizeOf(String key, Bitmap value) {
// TODO Auto-generated method stub
return value.getByteCount();
}
@Override
protected void entryRemoved(boolean evicted, String key,
Bitmap oldValue, Bitmap newValue) {
super.entryRemoved(evicted, key, oldValue, newValue);
// TODO Auto-generated method stub
if (evicted) {
SoftReference<Bitmap> bitmap = new SoftReference<Bitmap>(
oldValue);
map.put(key, bitmap);
}
}
}
}