2

アプリのメモリ不足エラーのバグレポートを調査しています。

私たちのアプリは、リストビュー アイテムの一部としてアプリケーション アイコンを含むリストビューを表示します。

このリストビューが標準の 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 »
4

1 に答える 1

0

マージアダプターは、表示されていないビューをどういうわけか解放しないようです。これは正しいです?

「ビュー」が「交互のヘッダーテキストビュー」を意味する場合、もちろんMergeAdapter「ビューにないビューは解放されません」-MergeAdapter解放されMergeAdapterた場合、ユーザーがスクロールバックしたときに表示できません。View一度リリースされると、それらを元に戻す方法はありません。

「ビュー」とは、「以前に使用したようなベースアダプター」の内容を意味する場合、そもそもMergeAdapterそれらViewを保持することはないため、保持することはできません。ただし、のようなメソッドの値を増やすと、のgetCount()キャッシュが変更される可能性がありListViewます。

于 2012-12-05T15:56:59.163 に答える