Я отслеживал потенциальные утечки памяти в своем приложении для Android, и я наткнулся на одну, с которой я не уверен, что делать.Сначала я опишу то, что я пытаюсь сделать.
Для чего это стоит, я строю для Eclair (2.1, API уровень 7) и тестирую на HTC Incredible под управлением Gingerbread (2.3.7Уровень API 10).Наблюдая за LogCat, я предполагаю, что мое приложение имеет максимальный размер кучи около 32 МБ.
Я пытаюсь создать адресную книгу, в которой у вас есть несколько страниц контактов.Вы перемещаетесь между страницами, прокручивая влево и вправо, и перемещаетесь по текущей странице, прокручивая вверх и вниз.Для этого я использую Gallery
, адаптер которого адаптирует список контактов в ListView
, адаптер которого, в свою очередь, адаптирует один контакт в RelativeLayout
.
Все работает нормально,но у меня не хватает родной (внешней) памяти действительно быстро при пролистывании через галерею.Я сделал сброс HPROF после того, как провел некоторое время вокруг Gallery
и потянул его в MAT.В гистограмме я обнаружил, что у меня было несколько сотен моих контактов RelativeLayout
, которые удерживались исключительно моими контактами ListView
с.Вот что я нашел, когда посмотрел на выход [[усеченный] MAT merge_shortest_paths ListView
:
android.view.ViewRoot$1
+ this$0 android.view.ViewRoot
+ mAttachInfo android.view.View$AttachInfo
+ mScrollContainers java.util.ArrayList
+ array java.lang.Object[303]
+ [110], [112], [114], [116], [118], ... com.example.LeakyListView
+ ...and so forth.
Единственное, что удерживало эти утечки ListView
s, это android.view.View$AttachInfo
* mScrollContainers
поле.Проблема в том, что я не знаю, как мои взгляды попадают туда, во-первых, поэтому я не знаю, как устранить эту утечку.
Как мне решить эту утечку памяти? Или, по крайней мере, как была создана эта цепочка ссылок и что такое ViewRoot
, AttachInfo
и mScrollContainers
?
Я попытаюсь выделить ее для простого тестарегистрационный номер и код здесь скоро, но я надеюсь, что этого достаточно, чтобы начать разговор.