我有一些在android中缓存图像的麻烦。我使用AsyncTask从URL下载图像。在下载之前,我会检查缓存中是否已经包含一个带有URL作为关键字的Drawable。如果是,Drawable将从缓存中取出。如何在Android中使图像缓存工作?
下载由ListFragment的自定义ArrayAdapter或另一个Fragment中的onCreateView()触发。
我的问题如下:第一次下载正常。但是,如果我滚动ListFragment,加载了错误的图像。如果我重新加载List或Fragment,则图像将从缓存中取出,ImageView将为空。如果我不使用缓存,图像将正确显示。
这里我CacheHandler的代码:
import android.graphics.drawable.Drawable;
import android.util.LruCache;
public class CacheHandler {
private static CacheHandler instance;
private LruCache<String, Drawable> cache;
private final Logger logger = new Logger(CacheHandler.class);
private CacheHandler() {
final int maxMemory = (int) (Runtime.getRuntime().maxMemory()/1024);
final int cacheSize = maxMemory/8;
cache = new LruCache<String, Drawable>(cacheSize);
}
public static CacheHandler getInstance() {
if (instance == null)
instance = new CacheHandler();
return instance;
}
public void addToCache(String key, Drawable pic) {
if (getFromCache(key) == null) {
cache.put(key, pic);
logger.debug("Added drawable to cache with key " + key);
} else
logger.debug("Drawable with key " + key + " already exists");
}
public Drawable getFromCache(String key) {
logger.debug("Getting image for " + key);
Drawable d = cache.get(key);
logger.debug("Image is " + d);
return d;
}
}
在这里的的AsyncTask电话:
logger.debug("Checking cache");
Drawable d = CacheHandler.getInstance().getFromCache((String) params[0]);
谢谢您的帮助。
使用421推荐的库之一,不需要重新发明轮子;) – FWeigl 2013-03-08 11:44:51