这个问题让我十分困惑。我有一个管理已下载位图图像缓存的静态类。这个类可能被多个线程同时访问。以下是实现代码:
public class BitmapCache {
private static final int MAX_NUMBER_BITMAPS_TO_CACHE = 30;
private static Map<String, Bitmap> bitmapCache = new HashMap<String, Bitmap>();
private static List<String> cachedBitmapUrlsOrder = new ArrayList<String>();
private BitmapCache(){}
public static synchronized void addBitmapToCache(String url, Bitmap bitmap) {
if (bitmapCache.size() >= MAX_NUMBER_BITMAPS_TO_CACHE) {
Log.i("MyApp", "Max cache size reached. Removing oldest bitmap. Size = " + bitmapCache.size());
String oldestUrl = cachedBitmapUrlsOrder.remove(0);
bitmapCache.remove(oldestUrl);
}
bitmapCache.put(url, bitmap);
cachedBitmapUrlsOrder.add(url);
}
public static int size() {
return bitmapCache.size();
}
public static Bitmap get(String url) {
return bitmapCache.get(url);
}
public synchronized static void clearCache() {
bitmapCache.clear();
}
}
我正在尝试实现一个滚动缓存,以便当达到最大缓存大小时(这是一个常见的情况),从缓存中删除最旧的位图。运行我的应用程序会产生以下输出:
02-29 23:00:26.590: I/MyApp(10789): Max cache size reached. Removing oldest bitmap. Size = 30
02-29 23:00:26.600: I/MyApp(10789): Max cache size reached. Removing oldest bitmap. Size = 30
02-29 23:00:26.720: I/MyApp(10789): Max cache size reached. Removing oldest bitmap. Size = 30
02-29 23:00:26.790: I/MyApp(10789): Max cache size reached. Removing oldest bitmap. Size = 30
02-29 23:00:26.820: I/MyApp(10789): Max cache size reached. Removing oldest bitmap. Size = 31
02-29 23:00:26.850: I/MyApp(10789): Max cache size reached. Removing oldest bitmap. Size = 31
02-29 23:00:27.050: I/MyApp(10789): Max cache size reached. Removing oldest bitmap. Size = 32
02-29 23:00:27.070: I/MyApp(10789): Max cache size reached. Removing oldest bitmap. Size = 32
02-29 23:00:27.100: I/MyApp(10789): Max cache size reached. Removing oldest bitmap. Size = 33
02-29 23:00:27.130: I/MyApp(10789): Max cache size reached. Removing oldest bitmap. Size = 34
02-29 23:00:27.170: I/MyApp(10789): Max cache size reached. Removing oldest bitmap. Size = 35
02-29 23:00:27.210: I/MyApp(10789): Max cache size reached. Removing oldest bitmap. Size = 35
02-29 23:00:27.330: I/MyApp(10789): Max cache size reached. Removing oldest bitmap. Size = 35
02-29 23:00:27.360: I/MyApp(10789): Max cache size reached. Removing oldest bitmap. Size = 35
代码在缓存大小达到30时开始正确记录“最大缓存大小已达到”,并在几次执行后保持不变。但是,之后它奇怪地增加到35。此时它会在数百个输出中保持不变。我无法让其增加到35以上。
我的实现有什么问题?鉴于addBitmapToCache方法是同步的,我对缓存大小如何超过设置的最大值感到困惑。
bitmapCache.remove(oldestUrl)
未能从缓存中删除该项。您有任何想法是怎么发生的吗? - Chris Knight