Как я могу освободить Drawable память в одном Android Honeycomb Activity после запуска другого Activity? - PullRequest
1 голос
/ 25 октября 2011

У меня есть приложение Android Honeycomb с двумя действиями;первый имеет большой Bitmap (взятый из ресурсов) в качестве фона для основного LinearLayout, и я обнаружил, что установка фона этого элемента на null из метода onStop() действия может спасти многопамять - около 5 МБ, на самом деле.

Однако, похоже, это работает, только когда я нажимаю кнопку «сна» на устройстве.Если я сделаю это, профилировщик покажет, что 5 МБ выпадают из мира так легко, как вам нравится.Если я начну второе действие, onStop() первого действия не будет получено до тех пор, пока не будет выполнено действие onCreate() второго действия, и профилировщик предполагает, что BitmapDrawable в конце концов не удаляется из памяти - так что он сидит, пять невидимыхбесполезные мегабайты, загромождающие место.

Я мог бы удалить это из onPause(), что могло бы работать лучше, но я также использую методы onStop() различных элементов Dialog, чтобы обнулить их фоновые рисункитакже.Похоже, что у них нет методов onPause().

Есть ли рекомендуемый метод для избавления от этих видов больших, занимающих память элементов при запуске другого действия?

Ответы [ 2 ]

1 голос
/ 25 октября 2011

Также для меня событие OnPause - лучшее место, где можно поместить свой код «без памяти».

Здесь поток событий, когда вы открываете дочернее действие из родительского действия

-- Open caller activity -- 
[ActCaller] 1311090884303: onCreate
[ActCaller] 1311090884572: onStart
[ActCaller] 1311090884699: onPostCreate savedInstanceState null
[ActCaller] 1311090884802: onResume
[ActCaller] 1311090884908: onPostResume
-- Open child activity --
[ActCaller] 1311090926270: onSaveInstanceState
[ActCaller] 1311090926374: onPause
  [ActChild] 1311090926556: onCreate
  [ActChild] 1311090926703: onStart
  [ActChild] 1311090926807: onPostCreate savedInstanceState null
  [ActChild] 1311090926911: onResume
  [ActChild] 1311090927014: onPostResume
[ActCaller] 1311090927508: onStop

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

А как насчет вызова кода без памяти из двух разных мест?Учтите, что диалоги, как правило, не полностью охватывают вызывающую деятельность, поэтому сохранение ее фона имеет смысл.Возможно, можно установить флаг при открытии нового действия вместо диалога, и логика OnPause будет сбрасывать фон только при запуске нового действия, а не диалоговое окно.

0 голосов
/ 25 октября 2011

Нет особого способа обработки таких вещей, это обычный способ Java:

Объекты - это мусор, собираемый в неизвестное время в будущем , если они больше не ссылаются.

Только не храните ссылки на то, что вам не нужно, и все будет в порядке.

Проверьте это видео, чтобы получить больше информации об этом:

http://www.youtube.com/watch?v=_CruQY55HOk

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...