Утечка памяти в списках - PullRequest
0 голосов
/ 14 декабря 2011

У меня утечка памяти в ListView. Я очень хорошо знаю, что оптимизация списков в Android - очень распространенная тема, и в Интернете есть много учебных пособий и вопросов по переполнению стека, но ни один из них, похоже, не решает мою проблему.

Проблема в том, что при нажатии клавиши «Назад» память, используемая представлениями строк, не «освобождается»

Я сократил свою реализацию getView до этого, поэтому я не заполняю информацию, а просто раздуваю макет строки:

@Override
public View getView(int position, View v, ViewGroup parent) {
    if(v == null){
        LayoutInflater vi = LayoutInflater.from(getContext());
        v = vi.inflate(R.layout.listview_row, null);
    }
    return v;
}

Конструктор адаптера также очень прост, поэтому я не сохраняю ничего в глобальных переменных, а также информацию для заполнения строк (которая находится в пределах p_items):

public IconListView(Context p_context, int p_textViewResourceId,   ArrayList<IconListViewRow> p_items,) {
    super(p_context, p_textViewResourceId, p_items);    
} 

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

Кажется, что любой урок, который я прочитал, позаботится об этом. Есть умные улучшения для производительности списков, как ViewHolder, но ни один не связан с этим. На самом деле они используют довольно простые макеты для строк, поэтому вы не сможете оценить тревожное потребление памяти, хотя в любом случае оно всегда возрастает до бесконечности.

Ответы [ 3 ]

0 голосов
/ 14 декабря 2011

Когда нажата кнопка «Назад», ваша деятельность и ее содержимое все еще живы и не удаляются.Если вы хотите освободить память в этом случае, вы должны реагировать в методе onPause ().В качестве первой меры я бы попытался вернуть 0 из вашего адаптера списка и уведомить список измененных данных.Если это не помогает - тогда вам, возможно, придется полностью уничтожить список.

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

0 голосов
/ 17 января 2012

Я обнаружил что-то актуальное.Когда вы используете настраиваемые компоненты для разметки строк, например:

MyTextView extends TextView
MyButton   extends Button

, происходит утечка памяти.Память, используемая моими приложениями, сильно сократилась с тех пор, как я отказался от этих компонентов в ListViews.

Это происходит, по крайней мере, с моими настроенными компонентами.Я не могу предположить, что это происходит с каждым настроенным компонентом, возможно, у меня что-то не так, но будьте осторожны с этим.

0 голосов
/ 14 декабря 2011

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

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