2010-01-25 6 views
3

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

Я читал, что вопреки тому, что можно было ожидать, не все объекты, созданные основной деятельностью приложения (или в классах, вызываемых этим действием), уничтожаются, когда действие уничтожается. В частности, я думаю, что я прочитал (хотя теперь я не могу найти, где), что если View использует большой объект-член bitmap, тогда метод onDestroy() Activity должен быть перегружен, а растровое изображение должно быть явно переработано.

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

ответ

5

Есть ли исчерпывающий учебник или руководство по этой теме?

Не совсем.

Есть ли другие объекты, которые должны быть уничтожены или удалены, когда активности уничтожаются? Как насчет Слушатели?

Растровые изображения необычны, отчасти потому, что они используют память за пределами кучи 16 МБ, если я правильно понимаю византийскую модель памяти Android.

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

  • статических данных по классам (например, вы соорудить свой собственный каркас слушатель с одним из ваших услуг, так что ваша служба держит на слушатель, который держит на вашу деятельность)
  • темы (например, вы вручную разворачиваете фоновый поток и не завершаете его)
+0

Спасибо за ваш быстрый ответ. Поскольку я не знаю, как создать свою собственную услугу или разветвить поток, я полагаю, что для меня это не проблема. Одна вещь, которую я не понимаю, заключается в том, что основной принцип состоит в том, что GC будет восстанавливать память от объекта, когда он выходит из области видимости, почему это не происходит с растровым изображением, созданным в рамках Activity, когда эта активность заканчивается. Я чувствую, что, если бы понял, что у меня будет больше шансов идентифицировать другие вещи, которые могут вызвать подобные проблемы. – prepbgg

+0

«Единственное, что я не понимаю, - это основной принцип, согласно которому GC будет восстанавливать память из объекта, когда он выходит из сферы действия, почему это не происходит с растровым изображением, созданным в рамках Activity, когда эта активность заканчивается» - - для начала GC не является немедленным. Это происходит асинхронно. Для больших блоков памяти, таких как растровые изображения, может быть слишком поздно, поэтому есть механизм для проактивного намека на Android, чтобы растровые изображения могли быть переработаны (например, для использования в следующем действии). – CommonsWare

+0

Спасибо за объяснение. – prepbgg

1

Обратите внимание, что установка android:configChanges="orientation" в манифесте предотвращает разрушение Activity при повороте экрана. Поэтому мне больше не нужно беспокоиться о том, нужно ли мне уничтожать или удалять отдельные растровые изображения или другие объекты! (Спасибо Ribo за то, что указали это на другую тему.)