Сопрягает ли SoftReference .recycle () в объекте Bitmap

Если я храню растровые изображения в хэш-карте с помощью SoftReference, вызовет SoftReference .recycle () в Bitmap? И если это не так, то каков был бы способ правильно очистить растровое изображение из памяти в данной ситуации (когда растровые изображения находятся внутри HashMap)?

Если я храню растровые изображения в хэш-карте с помощью SoftReference, вызовет SoftReference .recycle () в Bitmap?

Нет. Что делать, если вместо Bitmap вы храните String или POJO? Есть ли у них метод recycle ? Конечно же нет. Итак, вопрос: для чего SoftReference ?

Вы используете SoftReference когда хотите, чтобы объект, на который ссылался, оставался в живых, пока хост-процесс не работает на памяти. Объект не будет иметь права на сбор до тех пор, пока сборщик не захочет освободить память. Неясно заявлено, что привязка SoftReference означает: « SoftReference объект, пока не сможете больше». ( Ссылка )

Вам не нужно заботиться об очистке растрового изображения (вызывая метод recycle ); Просто позвольте SoftReference выполнять свою работу.

Из документа Bitmap.recycle:

 This is an advanced call, and normally need not be called, since the normal GC process will free up this memory when there are no more references to this bitmap. 

Таким образом, для слабого удерживания битмапа достаточно. Если по какой-то причине вам нужно агрессивно освободить этот ресурс, вам не повезло со слабой ссылкой.

РЕДАКТИРОВАТЬ

Я не знаком с реализацией Bitmap в android, но то, что может случиться, заставляет одно иметь дело с ресурсами Bitmap явно, является тот факт, что некоторая память не создается в куче. Таким образом, процесс может закончиться без памяти, в то время как GC не нужен. Представьте себе небольшой объект, содержащий большой кусок памяти, выложенный из другого места. Финализация объекта может быть подготовлена ​​для освобождения памяти, но нет никакой причины для VM для GC, поэтому собственная память «потеряна».

Но в этом случае слабая ссылка тоже не поможет, поскольку она обрабатывается только после gc. Единственное, что помогает здесь, – это явное «переработку», возможно, с помощью подсчета ссылок.

Связанные ресурсы Bitmap будут освобождены после GC, благодаря его методу finalize() . recycle() заключается в освобождении ресурсов, не дожидаясь его, если вы знаете, что он больше не нужен, что не является вашим делом. Вы используете SoftReference потому что хотите переработать изображение, если состояние памяти отсутствует.

Если объект, на который ссылается WeakReference, будет GC'd, я бы предположил, что это приведет к методу утилизации на растровом изображении. Однако я не уверен, поэтому, чтобы быть в безопасности, вы могли бы сделать что-то вроде переопределения класса WeakReference, создавая класс WeakReference, специфичный для Bitmap, который вызывает метод recycle, когда это refrence является GC'd.

Решение должно сделать что-то вроде этого, но оно не проверено:

 private final class WeakBitmapReference extends WeakReference<Bitmap> { public WeakBitmapReference(Bitmap b) { super(b); } public void clear() { Bitmap b = get(); if (b != null && !b.isRecycled()) b.recycle(); super.clear(); } }