У меня возникла странная проблема, когда я использовал мягкую ссылку на Android. я реализовал класс для кэша растрового, исходный код выглядит следующим образом:Софт-ссылка не работает должным образом на Android
public class ImageCache
{
private static HashMap<String, SoftReference<Bitmap>> mCache = new HashMap<String, SoftReference<Bitmap>>();
private static final String TAG = "ImageCache";
public static Bitmap getBitmap(String url)
{
Bitmap bitmap = null;
if (mCache.containsKey(url))
{
Log.d(TAG, "use cache: " + url);
bitmap = mCache.get(url).get();
if (bitmap != null)
{
return bitmap;
}
else
{
Log.w(TAG, "#######################soft ref was collected!!!");
}
}
bitmap = BitmapFactory.decodeFile(url);
if (bitmap == null)
{
Log.e(TAG, "#####jpg not found");
return null;
}
bitmap = Bitmap.createScaledBitmap(bitmap, 320, 240, false);
synchronized (mCache) {
mCache.put(url, new SoftReference<Bitmap>(bitmap));
}
return bitmap;
}
}
Но я нашел через LogCat, что мягкая ссылка собираются часто. Журнал:
#######################soft ref was collected!!!
Насколько я знаю, мягкие ссылки будут собраны с помощью ОГО, только если Java кучи вырастет до своего предела, и нет места для нового распределения памяти.
Но почему мягкая ссылка на Android не ведет себя так, как ожидалось?
контрольный счет для растрового изображения может быть 0 .. думаю. («мягкое» реферирование сохраняется в mCache, но я не могу найти другую ссылку на растровое изображение) – Toris
Не рекомендуется использовать SoftReference для кеша. Вместо этого используйте LRUCache. – songchenwen