私はこれで完全に困惑しています。私はダウンロードされたビットマップイメージのキャッシュを管理する静的クラスを持っています。このクラスは、同時アクセスが可能な複数のスレッドによってアクセスされます。私は、最大キャッシュサイズは、(一般的な発生を)に達したときに、最も古いビットマップがキャッシュから削除されるように、ローリングキャッシュを実装しようとしているキャッシュメカニズムが期待どおりに機能しないのはなぜですか?
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
メソッドが同期されていると、キャッシュサイズが最大セットを超えてどのように拡大する可能性があるのか困惑しています。
、(0)、それは自動的にあなたのためのダウンアイテムの残りの部分をシフトしていますか? –
javadocによれば、それは... – assylias
本当にアイテムが本当に削除されていることを確認するためにマップから削除した後に再びサイズを記録する価値がありますか? – assylias