Я пишу очень интенсивное приложение для Android Honeycomb, и я старался recycle() unused Bitmap по возможности; действительно, это необходимо, чтобы приложение работало вообще, поскольку Bitmap постоянно циклически включаются и выходят из памяти. Тем не менее, я только что реализовал onConfigurationChanged() в Activity, и поэтому (по ряду причин) я пытаюсь поместить процедуры освобождения памяти в onStop().
В настоящее время мой метод onStop():
- устанавливает
Viewдля отображения значения по умолчаниюDrawable; - вызывает
recycle()вBitmap, ранее используемом этимиViews; - ссылается на ссылки
Bitmaps.
К сожалению, используя профилировщик памяти Eclipse, кажется, что это вообще не влияет на использование памяти.
Как вы можете себе представить, сделав так много усилий, чтобы освободить ресурсы на номинально собранном мусором языке, я бы надеялся на немного больше эффекта. Поэтому мой вопрос: что делает recycle()? Действительно ли это запускает сборку мусора или система будет удерживать память - даже если вы вызываете System.gc() - пока она не почувствует необходимость избавиться от чего-то?
NB Я знаю, что Bitmap на самом деле не хранится в обычной куче, но я думал, что называть recycle() было достаточно, чтобы убедиться, что они выпадали из родной кучи.
ЧАСТЬ ОТВЕТА
Я обнаружил, что если ImageView содержит Bitmap, который был переработан, данные Bitmap все еще сохраняются в памяти до тех пор, пока setImageBitmap(null) не будет вызван на ImageView. Это может быть даже в случае, если вызываются setImageResource(...) или setImageDrawable(...) (они были загружены в относительно небольшой 9-патч), однако анализ MAT показывает, что это не удаляло большой Bitmap, который содержался в частной членов ImageView). Просто вызов этой функции в onStop() отобрал около 10 МБ из кучи нашего приложения. По-видимому, это может быть не так, например, для сотовых телефонов Android.