Преимущество Drawable над растровым изображением для памяти в Android

Этот вопрос связан с ответами на следующий вопрос:

Ошибка удаления растровых изображений[Android]

Есть ли какое-либо преимущество использования Drawable над Bitmap в Android с точки зрения выделения памяти?

Я просматривал полки проекта Ромена Гая, и он использует SoftReference для кешей изображений, но я не могу найти, где находится код, который освобождает эти Drawables, когда SoftReference автоматически освобождает память для растрового изображения. Насколько я знаю, .recycle() должен быть явно вызван в растровом изображении, чтобы он был освобожден.


person 2cupsOfTech    schedule 31.12.2010    source источник


Ответы (3)


Насколько я понимаю, растровые изображения обычно лучше для производительности, если вам не нужно много манипулировать изображениями. Однако я сталкивался с утечками памяти, когда не перерабатывал их вручную. Мое решение состояло в том, чтобы написать класс, который поможет мне управлять моими изображениями. это обеспечивает простой способ повторного использования всех моих растровых изображений в определенных точках моего приложения. Он также предоставляет простой способ повторного использования уже загруженных ресурсов (включая Drawables).

person devnate    schedule 04.03.2011

Вам не нужно вызывать Bitmap.reycle(). Это будет сделано за вас в его финализаторе. Выполнение этого в финализаторе означает, что выделение будет отложено до тех пор, пока не запустятся финализаторы, поэтому, когда это возможно, прямой вызов recycle() может помочь с управлением памятью.

person hackbod    schedule 31.12.2010
comment
не нужно вызывать .recycle(), я видел где-то здесь комментарий romain в stackoverflow, говорящий сделать это, поскольку растровые изображения изначально выделены, и если это не сделано, это утечка памяти - person 2cupsOfTech; 01.01.2011
comment
Возможно, вы захотите проверить профиль пользователя, прежде чем называть его неправильным. - person Austyn Mahoney; 01.06.2012
comment
@AustynMahoney Эксперты тоже могут ошибаться. Прислушайтесь к совету эксперта, но не следуйте ему неукоснительно. Проверка профиля пользователя гораздо менее важна, чем доказательство. Никаких доказательств или ссылок не было предоставлено ни от кого. В любом случае хороший ответ от hackbod. - person user1132959; 24.07.2013
comment
Наряду с этим важно отметить, что финализатор не будет работать, если на него больше не будет ссылок, я полагаю. Так что в некоторых случаях вы все равно захотите вызвать Bitmap.recycle(). - person user1132959; 24.07.2013
comment
Это не просто эксперт... Вероятно, она написала код Android, о котором мы здесь говорим. - person Austyn Mahoney; 27.07.2013

Акк. на эту страницу, начиная с уровня API 11, растровое изображение пиксельные данные хранятся в Dalvik Heap вместе со связанным растровым изображением. Таким образом, вызов .recycle на самом деле не требуется, если только вы не хотите вручную освобождать память для дальнейшего использования. Обязательно разыменуйте растровое изображение, просто как дополнительную меру.

PS: это была ссылка, которая объясняет ответ hackbod.

person noob    schedule 11.03.2014