2012-04-20 3 views
2

Я работаю над проектом, связанным с деятельностью карты. Я запускал тестовое приложение, состоящее из одного действия MaptestActivity, которое расширяет MapActivity и ничего не делает. Я повернул устройство более десяти раз, и я проанализировал кучу кучи с помощью MAT. Я заметил, что существует два экземпляра основной активности (утечка?). Я повторно протестировал приложение с тем же действием, что и только Activity: дамп показал только один экземпляр, хранящийся в системе, текущий. Я прилагаю скриншоты обоих случаев. Я не очень люблю MAT, может быть, я просто неправильно понимаю результаты, и все работает нормально. Не могли бы вы пролить свет на него?android GoogleMaps утечки памяти (?)

With memory leak

Without memory leak

+0

решить проблему? –

+0

Пока нет, я работаю над этим (используя отражение). Я отправлю решение, как только я (надеюсь) найду его! – Matthew

+0

ничего не нашел? – njzk2

ответ

0

добавить строку ниже в течение вашей деятельности в вашей manifeast файле

андроида: configChanges = "keyboardHidden | ориентация"

+0

Правда, это предотвратит воссоздание активности. Звучит как обход. – Matthew

1

Если у вас есть два вида деятельности в память после вращения устройства, то у вас есть утечка памяти. Вы можете использовать MAT, чтобы узнать, что мешает этой активности быть собранным с помощью гистограммы. Найдите имя класса, чтобы найти его. Затем щелкните по нему правой кнопкой мыши и выберите объекты списка/с входящими ссылками. Это будет отображать каждое вхождение этого объекта в память. Щелкните правой кнопкой мыши по одному из этих объектов и выберите «Путь к корням GC»/исключите слабые ссылки. Теперь вы должны иметь возможность видеть иерархию объектов, из которых что-то не очищается полностью после завершения операции onDestroy. Такие вещи, как жесткие ссылки на статический контекст, вызовут это. Чтобы решить некоторые из наших проблем с памятью, нам нужно было делать такие вещи, как, например, использовать weakReferences и чистить вещи в onDestroy (например, устанавливать прослушиватели в null).

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

Это хорошее видео: Memory Management for Android Apps И хорошая статья: Avoiding Memory Leaks

+0

Спасибо Скотту. Вот что я сделал. Ниже приведен снимок экрана о том, что держит homeActivity: [link] (http://postimage.org/image/7vauzrru9/). Кажется, что объект google maps сохраняет ссылку на него. Как я уже говорил, homeActivity расширяет MapActivity и ничего не делает (это не событие загрузки карты). – Matthew

+0

Посмотрите, можете ли вы вызвать что-то, чтобы очистить объект, находящийся в onDestroy. Если ни один из методов недоступен, и нет общедоступной переменной, вы не можете установить значение null, которое очистит ее, вы можете использовать отражение для доступа к частной переменной, о которой идет речь, чтобы ее исключить. Похоже, это известная проблема: http://stackoverflow.com/questions/5460650/android-mapview-always-causes-an-outofmemoryerror-in-nested-elements – Scott

+0

Постараюсь, спасибо. – Matthew

Смежные вопросы