Как перерабатываются ресурсы изображений?

Обычно я всегда использую Drawable ресурсы в Imageviews, потому что мне не нужно освобождать их вручную.

Но в некоторых случаях мне нужно динамически создавать растровые изображения, а затем я должен вручную вызывать для них recycle() в onDestroy(). Это лучшее решение, которое я нашел в соответствии с другим вопросом StackOverflow.

Я хочу понять, как Android управляет Drawable ресурсами и почему мне не нужно перерабатывать их вручную. И когда вы это поймете, посмотрите, можно ли применить подобную логику к растровым изображениям, созданным вручную.


person lujop    schedule 06.08.2012    source источник


Ответы (1)


Drawable намного шире, чем Bitmap. Drawable предназначен для представления всего, что графическая система может отобразить на дисплее. Существуют подклассы Drawable, такие как ShapeDrawable или ColorDrawable, которые не содержат Bitmap и, следовательно, не нуждаются в каком-либо ручном управлении памятью.

BitmapDrawable оборачивает Bitmap и содержит ссылку на Bitmap. Bitmap особенный, потому что Android хранит пиксельные данные для всех Bitmaps в отдельной куче, которая управляется отдельно от остальной части вашего приложения. Когда сборщик мусора Android очищает объект Bitmap, он также очищает пиксельные данные из растровой кучи. Но вы можете заставить это произойти раньше, вручную вызвав recycle() на Bitmap, что помечает Bitmap как недействительное и освобождает его пиксельные данные.

Android выделяет растровую кучу фиксированного размера для каждого работающего приложения, и ваше приложение может исчерпать свою кучу, оставив одновременно слишком много Bitmap. Вот почему, если ваше приложение широко использует растровые изображения, вы, вероятно, выиграете от повторного использования растровых изображений, как только узнаете, что они вам не понадобятся.

Обновление: как отмечено в комментариях, отдельная куча растровых изображений применяется к версиям Android до Honeycomb. Что касается Honeycomb, куча растровых изображений была объединена с кучей приложений. Вот сообщение SO с дополнительной информацией.

person mportuesisf    schedule 06.08.2012
comment
Тогда, если я правильно понял, есть какая-то магия. И если я вручную создам растровое изображение и установлю Imageview после onCreateView, я могу ожидать, что Android выпустит его так же, как он выпускает файлы, созданные ресурсами изображения? - person lujop; 06.08.2012
comment
Пока ваша активность не содержит никаких ссылок на созданный вручную Bitmap (например, в статическом поле или что-то в этом роде), он будет очищен сборщиком мусора вместе со всеми остальными объектами View. Метод recycle() полезен, если вы знаете, что растровое изображение вам больше не понадобится, и хотите освободить кучу растрового изображения для чего-то другого. - person mportuesisf; 06.08.2012
comment
Это хотя и предварительная сотовая структура, поскольку сотовая память растрового изображения находится в той же куче, что и остальная часть приложения. - person User; 06.08.2012
comment
@lxx - я смутно осознавал это изменение; спасибо за исправление. - person mportuesisf; 07.08.2012