Утечка памяти в Android с ListView внутри галереи - PullRequest
1 голос
/ 10 ноября 2011

Я отслеживал потенциальные утечки памяти в своем приложении для 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?

Я попытаюсь выделить ее для простого тестарегистрационный номер и код здесь скоро, но я надеюсь, что этого достаточно, чтобы начать разговор.

1 Ответ

3 голосов
/ 10 ноября 2011

Вы действительно, действительно должны использовать ViewPager вместо галереи для такого рода вещей: http://android -developers.blogspot.com / 2011/08 / horizontal-view-swiping-with-viewpager.html

...