アプリのメモリ不足エラーのバグレポートを調査しています。
私たちのアプリは、リストビュー アイテムの一部としてアプリケーション アイコンを含むリストビューを表示します。
このリストビューが標準の baseadapter を使用して設定されると、ドローアブルを含むビューが見えなくなると、アプリがドローアブルを保持しないことが観察されます。
これは、弱参照でもテストされています。
public Drawable getIcon() {
Log.v("AppResult", "getIcon()");
Drawable icon = appInfo.loadIcon(pm);
leakTester.add(new WeakReference<Drawable>(icon));
ArrayList<WeakReference<Drawable>> copy = new ArrayList<WeakReference<Drawable>>(leakTester);
for (WeakReference<Drawable> oldIcon: leakTester)
{
if (oldIcon.get() == null)
{
Log.v("AppResult", "iconRecycled");
copy.remove(oldIcon);
}
}
leakTester = copy;
return icon;
}
通常の baseadapter を利用したリストビューをスクロールするときのログ:
12-05 16:17:57.450: V/AppResult(24890): getIcon()
12-05 16:17:57.450: V/AppResult(24890): iconRecycled
12-05 16:17:57.510: V/AppResult(24890): getIcon()
12-05 16:17:57.520: V/AppResult(24890): iconRecycled
12-05 16:17:57.580: V/AppResult(24890): getIcon()
12-05 16:17:57.590: V/AppResult(24890): iconRecycled
12-05 16:17:57.730: V/AppResult(24890): getIcon()
12-05 16:17:57.730: V/AppResult(24890): iconRecycled
12-05 16:17:58.510: V/AppResult(24890): getIcon()
12-05 16:17:58.510: V/AppResult(24890): iconRecycled
12-05 16:17:58.570: V/AppResult(24890): getIcon()
12-05 16:17:58.570: V/AppResult(24890): iconRecycled
12-05 16:17:58.650: V/AppResult(24890): getIcon()
ただし、以前に使用したようなヘッダー テキストビューとベースアダプターが交互に配置されている mergeAdapter を使用すると、 iconRecycled
メッセージがほとんど表示されません。これらのアダプターは、使用可能な場合は recycleview を使用しますが。(アプリは、完全なリストをスクロールした後、35MB の使用量になりますが、他のアクティビティでは 12MB のままです)。
12-05 16:15:04.800: V/AppResult(24890): getIcon()
12-05 16:15:04.860: D/dalvikvm(24890): GC_FOR_ALLOC freed 34K, 1% free 35857K/36167K, paused 26ms
12-05 16:15:04.860: V/AppResult(24890): getIcon()
12-05 16:15:04.910: V/AppResult(24890): getIcon()
12-05 16:15:04.910: V/AppResult(24890): getIcon()
12-05 16:15:04.910: V/AppResult(24890): iconRecycled
12-05 16:15:04.910: V/AppResult(24890): iconRecycled
12-05 16:15:04.950: V/AppResult(24890): getIcon()
12-05 16:15:04.950: V/AppResult(24890): getIcon()
12-05 16:15:04.950: V/AppResult(24890): getIcon()
12-05 16:15:13.260: V/AppResult(24890): getIcon()
12-05 16:15:13.430: V/AppResult(24890): getIcon()
12-05 16:15:13.590: V/AppResult(24890): getIcon()
12-05 16:15:14.300: V/AppResult(24890): getIcon()
12-05 16:15:14.370: V/AppResult(24890): getIcon()
12-05 16:15:14.440: V/AppResult(24890): getIcon()
これは私の実装のエラーですか? mergeadapter は、ビューに表示されていないビューを何らかの形で解放していないようです。これは正しいです?
編集
これを MAT で実行した結果は次のとおりです。
java.util.ArrayList[32] @ 0x413beb88 144 19.833.288
\mScrapViews android.widget.AbsListView$RecycleBin @ 0x4129bd9040 19.833.496
.\mRecycler android.widget.ListView @ 0x412c5db8 896 23.635.384
..+mFocusedView, mRealFocusedView android.view.ViewRootImpl @ 0x4133fae8 440 1.776
..|+this$0 android.view.ViewRootImpl$2 @ 0x4136f540 Native Stack 16 16
..|+[1] android.view.ViewRootImpl[2] @ 0x41340930 » 24 24
..|+this$0 android.view.ViewRootImpl$AccessibilityInteractionConnectionManager @ 0x413157e8 » 16 16
..|\Total: 3 entries
..+mServedView, mNextServedView android.view.inputmethod.InputMethodManager @ 0x413511f8 » 104 368
..+listview com.denper.addonsdetector.ui.InstallDateLister @ 0x412d8bd8 »