我正在使用 LruCache 来存储位图。
这是我运行以存储位图的异步任务。
new AsyncTask<Void, Void, Bitmap>() {
@Override
protected Bitmap doInBackground(Void... args) {
String url = d.getImageUrl();
if (url != null && !url.equals("")) {
try {
LogUtils.log("getting image from cache");
Bitmap image = imageCache.getBitmapFromMemCache(url);
if (image == null) {
image = BitmapFactory.decodeStream(new URL(url)
.openConnection().getInputStream());
LogUtils.log("storing image to cache");
imageCache.addBitmapToMemoryCache(url, image);
} else {
LogUtils.log("got image from cache");
}
return image;
} catch (Exception e) {
e.printStackTrace();
}
}
return null;
}
@Override
protected void onPostExecute(Bitmap image) {
if (holder.image != null) {
if (image != null) {
holder.image.setImageBitmap(image);
holder.image.setVisibility(View.VISIBLE);
}
}
}
}.execute();
这是我的缓存实现:
public class ImageCache {
private static ImageCache instance;
public static ImageCache getInstance(Context context) {
if (instance == null)
instance = new ImageCache(context);
return instance;
}
private LruCache<String, Bitmap> mMemoryCache;
private ImageCache(Context context) {
// Get memory class of this device, exceeding this amount will throw an
// OutOfMemory exception.
final int memClass = ((ActivityManager) context
.getSystemService(Context.ACTIVITY_SERVICE)).getMemoryClass();
final int cacheSize = (1024 * 1024 * memClass)/8;
mMemoryCache = new LruCache<String, Bitmap>(cacheSize) {
@Override
protected int sizeOf(String key, Bitmap bitmap) {
// The cache size will be measured in bytes rather than number
// of items.
return bitmap.getRowBytes() * bitmap.getHeight();
}
};
}
public void addBitmapToMemoryCache(String key, Bitmap bitmap) {
LogUtils.log("key: " + key);
if (getBitmapFromMemCache(key) == null) {
mMemoryCache.put(key, bitmap);
}
}
public Bitmap getBitmapFromMemCache(String key) {
return mMemoryCache.get(key);
}
}
在我的清单中,我还有:
android:largeheap="true"
问题是在我的 ListView 中......当我向下滚动时......图像从 url 重新加载并且代码到达这一行:
LogUtils.log("storing image to cache");
什么可能导致这个问题?