Это продолжение моего более раннего вопроса ( утечка памяти Android? ) после некоторых исследований и выполнения некоторых из предложенных шагов.
Мое приложение имеет цикл пользовательского интерфейса, в котором пользователь щелкает элемент ListView, который рисует другой ListView после запроса веб-API. При нажатии на элемент появится другой ListView. Этот процесс может повторяться много раз пользователем без завершения действия.
Вот фрагмент кода того, как я заполняю ListView с помощью SimpleAdapter.
//* Add available times value using array.length()
List<Map<String,Object>> datalist = new ArrayList<Map<String,Object>>();
for (SomeResult result : results) {
Map map = new HashMap();
map.put("field_a", result.field_a);
map.put("field_b", result.field_b);
datalist.add(map);
}
String[] from = {"field_a","field_b"};
int[] to = {R.id.textview_a,R.id.textview_b};
// get a reference to the ListView
ListView lv = (ListView)findViewById(R.id.listview);
lv.setBackgroundColor(0xffffffff);
lv.setOnItemClickListener(itemclick_drawHours);
SimpleAdapter adapter = new SimpleAdapter(this.getApplicationContext(), datalist, R.layout.list_item, from, to);
lv.setAdapter(adapter);
lv.setScrollBarStyle(View.SCROLLBARS_INSIDE_OVERLAY);
lv.setCacheColorHint(0xffffffff);
viewFlipper.setDisplayedChild(2);
Используя DDMS и MAT, я заметил, что, хотя количество объектов ListView не увеличивается, число TextViews, RelativeLayouts и ImageViews неуклонно увеличивается вместе с количеством нажатий пользователем и составлением нового списка. Вот количество объектов этих трех виджетов + ListView на разных этапах использования приложения.
App Installed onto emulator:
android.widget.TextView: 16
android.widget.RelativeLayout: 9
android.widget.ImageView: 8
android.widget.ListView: 4
Light Use (a dozen or so clicks and ListViews drawn):
android.widget.TextView: 107
android.widget.RelativeLayout: 48
android.widget.ImageView: 34
android.widget.ListView: 4
Medium Use (a couple dozen clicks/ListViews drawn):
// At this point, a lot of GC messages and Resizing JIT Table messages etc. in LogCat
android.widget.TextView: 158
android.widget.RelativeLayout: 72
android.widget.ImageView: 61
android.widget.ListView: 4
Heavy Use (three dozen or so clicks/ListViews drawn):
// Even more messages in logcat
android.widget.TextView: 222
android.widget.RelativeLayout: 103
android.widget.ImageView: 92
android.widget.ListView: 4
Приложение на самом деле не вылетает при открытии, оно становится менее отзывчивым и медленным. После периода среднего / интенсивного использования закрытие и открытие приложения вызывает ошибку OutOfMemory при отображении ImageView.
Вот list_item.xml ..
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent">
<TextView
android:id="@+id/textview_a"
android:layout_width="wrap_content"
android:layout_height="fill_parent"
android:padding="10dp"
android:textColor="#000000"
android:layout_alignParentLeft="true"
android:textSize="18dp" >
</TextView>
<ImageView
android:id="@+id/rightarrow"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerVertical="true"
android:layout_marginRight="5dip"
android:src="@drawable/garrow"
android:layout_alignParentRight="true"
/>
<TextView android:layout_width="wrap_content" android:layout_height="wrap_content"
android:text="" android:id="@+id/textview_b" android:visibility="gone" />
</RelativeLayout>
Если вы посмотрите на соотношение 2 (TextViews) к 1 (ImageView) к 1 (RelativeLayout) в этом шаблоне и в количестве объектов выше, то кажется, что ImageViews, TextViews и RelativeLayouts, созданные SimpleAdapter, не выпускаются должным образом.
Есть что-нибудь очевидное, что я скучаю? Я читал некоторые другие посты, в которых говорится, что эта проблема возникает только в режиме «отладки». Я не уверен, как это включить / выключить, кроме изменения андроида: debuggable = "true" или "false" в манифесте.