これは、いくつかの調査を行い、提案されたいくつかの手順に従った後の私の以前の質問 ( Android メモリ リーク? ) のフォローアップです。
私のアプリケーションには、ユーザーが ListView アイテムをクリックする UI ループがあり、Web API にクエリを実行した後に別の ListView を描画します。項目をクリックすると、別の 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 オブジェクトの数は増えませんが、TextView、RelativeLayout、および ImageView の数は、ユーザーがクリックして新しいリストが描画される回数とともに着実に増加していることに気付きました。アプリ使用のさまざまな段階でのこれら 3 つのウィジェット +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
アプリが開いているときに実際にクラッシュすることはなく、応答が遅くなり、ラグが発生します。一定期間中程度または頻繁に使用した後、アプリを閉じてから開くと、ImageView を表示するときに OutOfMemory エラーが発生します。
ここに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(TextView) 対 1(ImageView) 対 1(RelativeLayout) の比率を見ると、SimpleAdapter によって作成された ImageViews、TextViews、および RelativeLayouts が適切に解放されていないようです。
私が行方不明であることは明らかですか?この問題は「デバッグ」モードでのみ発生するようだと彼らが言う他のいくつかの投稿を読みました。マニフェストで android:debuggable="true" または "false" を変更する以外に、これをオン/オフする方法がわかりません。