У меня утечка памяти в 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, но ни один не связан с этим. На самом деле они используют довольно простые макеты для строк, поэтому вы не сможете оценить тревожное потребление памяти, хотя в любом случае оно всегда возрастает до бесконечности.