Note that there are some explanatory texts on larger screens.

plurals
  1. POAndroid GridView garbage collecting (GC_EXTERNAL_ALLOC) <1K overzealously, causing very choppy UI
    primarykey
    data
    text
    <p>I have been looking at this for a long time and finally decided to post - my 2xN GridView, which consists of cells with a single image and piece of text is very choppy a lot of times (but sometimes perfectly smooth). Upon examining logcat output, I see things like this once I start scrolling (there are only 12 items in the list):</p> <pre><code>10-25 17:28:40.420: D/dalvikvm(12159): GC_EXTERNAL_ALLOC freed 6K, 47% free 3383K/6279K, external 2044K/2161K, paused 38ms 10-25 17:28:40.510: D/dalvikvm(12159): GC_EXTERNAL_ALLOC freed &lt;1K, 47% free 3383K/6279K, external 2044K/2161K, paused 36ms 10-25 17:28:40.600: D/dalvikvm(12159): GC_EXTERNAL_ALLOC freed &lt;1K, 47% free 3383K/6279K, external 2044K/2161K, paused 40ms 10-25 17:28:41.805: D/dalvikvm(12159): GC_EXTERNAL_ALLOC freed 1K, 47% free 3383K/6279K, external 2044K/2161K, paused 34ms 10-25 17:28:41.840: D/dalvikvm(12159): GC_EXTERNAL_ALLOC freed &lt;1K, 47% free 3383K/6279K, external 2044K/2161K, paused 25ms 10-25 17:28:41.880: D/dalvikvm(12159): GC_EXTERNAL_ALLOC freed &lt;1K, 47% free 3383K/6279K, external 2044K/2161K, paused 25ms 10-25 17:28:41.910: D/dalvikvm(12159): GC_EXTERNAL_ALLOC freed &lt;1K, 47% free 3383K/6279K, external 2044K/2161K, paused 20ms 10-25 17:28:41.940: D/dalvikvm(12159): GC_EXTERNAL_ALLOC freed &lt;1K, 47% free 3383K/6279K, external 2044K/2161K, paused 18ms </code></pre> <p>This was only a single flick to the bottom of the list and back up. Very choppy. If I keep scrolling up and down, the GC keeps going for maybe 5-6 scrolls, then stops. But as soon as I press Menu which brings up a 2-entry menu or switch activities and come back, GC comes back too.</p> <p>I turned off bitmap assignments for the image - same problem. My cells are essentially empty, yet GC still happens.</p> <p>I contacted Romain Guy who said I should try allocation tracking. I ran tracking and flicked, but saw no allocation in my own code. I did see allocations followed by calls to com.android.internal.os.BinderInternal$GcWatcher allocated in finalize, which matches the number of GC lines in logcat. Here is the whole Allocation Tracker dump (or <a href="https://i.imgur.com/J09YV.png" rel="nofollow noreferrer">as a picture</a> which is easier to parse):</p> <pre><code>1 24 org.apache.harmony.dalvik.ddmc.Chunk 5 org.apache.harmony.dalvik.ddmc.DdmServer dispatch 2 12 java.lang.Integer 5 java.lang.Integer valueOf 3 24 byte[] 5 dalvik.system.NativeStart run 4 20 java.util.concurrent.CopyOnWriteArrayList$ListIteratorImpl 1 java.util.concurrent.CopyOnWriteArrayList iterator 5 20 java.util.concurrent.CopyOnWriteArrayList$ListIteratorImpl 1 java.util.concurrent.CopyOnWriteArrayList iterator 6 20 java.util.concurrent.CopyOnWriteArrayList$ListIteratorImpl 1 java.util.concurrent.CopyOnWriteArrayList iterator 7 20 java.util.concurrent.CopyOnWriteArrayList$ListIteratorImpl 1 java.util.concurrent.CopyOnWriteArrayList iterator 8 20 java.util.concurrent.CopyOnWriteArrayList$ListIteratorImpl 1 java.util.concurrent.CopyOnWriteArrayList iterator 9 20 java.util.concurrent.CopyOnWriteArrayList$ListIteratorImpl 1 java.util.concurrent.CopyOnWriteArrayList iterator 10 20 java.util.concurrent.CopyOnWriteArrayList$ListIteratorImpl 1 java.util.concurrent.CopyOnWriteArrayList iterator 11 20 java.util.concurrent.CopyOnWriteArrayList$ListIteratorImpl 1 java.util.concurrent.CopyOnWriteArrayList iterator 12 20 java.util.concurrent.CopyOnWriteArrayList$ListIteratorImpl 1 java.util.concurrent.CopyOnWriteArrayList iterator 13 20 java.util.concurrent.CopyOnWriteArrayList$ListIteratorImpl 1 java.util.concurrent.CopyOnWriteArrayList iterator 14 20 java.util.concurrent.CopyOnWriteArrayList$ListIteratorImpl 1 java.util.concurrent.CopyOnWriteArrayList iterator 15 20 java.util.concurrent.CopyOnWriteArrayList$ListIteratorImpl 1 java.util.concurrent.CopyOnWriteArrayList iterator 16 20 java.util.concurrent.CopyOnWriteArrayList$ListIteratorImpl 1 java.util.concurrent.CopyOnWriteArrayList iterator 17 20 java.util.concurrent.CopyOnWriteArrayList$ListIteratorImpl 1 java.util.concurrent.CopyOnWriteArrayList iterator 18 20 java.util.concurrent.CopyOnWriteArrayList$ListIteratorImpl 1 java.util.concurrent.CopyOnWriteArrayList iterator 19 20 java.util.concurrent.CopyOnWriteArrayList$ListIteratorImpl 1 java.util.concurrent.CopyOnWriteArrayList iterator 20 20 java.util.concurrent.CopyOnWriteArrayList$ListIteratorImpl 1 java.util.concurrent.CopyOnWriteArrayList iterator 21 20 java.util.concurrent.CopyOnWriteArrayList$ListIteratorImpl 1 java.util.concurrent.CopyOnWriteArrayList iterator 22 20 java.util.concurrent.CopyOnWriteArrayList$ListIteratorImpl 1 java.util.concurrent.CopyOnWriteArrayList iterator 23 20 java.util.concurrent.CopyOnWriteArrayList$ListIteratorImpl 1 java.util.concurrent.CopyOnWriteArrayList iterator 24 20 java.util.concurrent.CopyOnWriteArrayList$ListIteratorImpl 1 java.util.concurrent.CopyOnWriteArrayList iterator 25 20 java.util.concurrent.CopyOnWriteArrayList$ListIteratorImpl 1 java.util.concurrent.CopyOnWriteArrayList iterator 26 20 java.util.concurrent.CopyOnWriteArrayList$ListIteratorImpl 1 java.util.concurrent.CopyOnWriteArrayList iterator 27 20 java.util.concurrent.CopyOnWriteArrayList$ListIteratorImpl 1 java.util.concurrent.CopyOnWriteArrayList iterator 28 20 java.util.concurrent.CopyOnWriteArrayList$ListIteratorImpl 1 java.util.concurrent.CopyOnWriteArrayList iterator 29 20 java.util.concurrent.CopyOnWriteArrayList$ListIteratorImpl 1 java.util.concurrent.CopyOnWriteArrayList iterator 30 20 java.util.concurrent.CopyOnWriteArrayList$ListIteratorImpl 1 java.util.concurrent.CopyOnWriteArrayList iterator 31 20 java.util.concurrent.CopyOnWriteArrayList$ListIteratorImpl 1 java.util.concurrent.CopyOnWriteArrayList iterator 32 20 java.util.concurrent.CopyOnWriteArrayList$ListIteratorImpl 1 java.util.concurrent.CopyOnWriteArrayList iterator 33 20 java.util.concurrent.CopyOnWriteArrayList$ListIteratorImpl 1 java.util.concurrent.CopyOnWriteArrayList iterator 34 20 java.util.concurrent.CopyOnWriteArrayList$ListIteratorImpl 1 java.util.concurrent.CopyOnWriteArrayList iterator 35 20 java.util.concurrent.CopyOnWriteArrayList$ListIteratorImpl 1 java.util.concurrent.CopyOnWriteArrayList iterator 36 20 java.util.concurrent.CopyOnWriteArrayList$ListIteratorImpl 1 java.util.concurrent.CopyOnWriteArrayList iterator 37 20 java.util.concurrent.CopyOnWriteArrayList$ListIteratorImpl 1 java.util.concurrent.CopyOnWriteArrayList iterator 38 20 java.util.concurrent.CopyOnWriteArrayList$ListIteratorImpl 1 java.util.concurrent.CopyOnWriteArrayList iterator 39 20 java.util.concurrent.CopyOnWriteArrayList$ListIteratorImpl 1 java.util.concurrent.CopyOnWriteArrayList iterator 40 20 java.util.concurrent.CopyOnWriteArrayList$ListIteratorImpl 1 java.util.concurrent.CopyOnWriteArrayList iterator 41 20 java.util.concurrent.CopyOnWriteArrayList$ListIteratorImpl 1 java.util.concurrent.CopyOnWriteArrayList iterator 42 20 java.util.concurrent.CopyOnWriteArrayList$ListIteratorImpl 1 java.util.concurrent.CopyOnWriteArrayList iterator 43 20 java.util.concurrent.CopyOnWriteArrayList$ListIteratorImpl 1 java.util.concurrent.CopyOnWriteArrayList iterator 44 20 java.util.concurrent.CopyOnWriteArrayList$ListIteratorImpl 1 java.util.concurrent.CopyOnWriteArrayList iterator 45 20 java.util.concurrent.CopyOnWriteArrayList$ListIteratorImpl 1 java.util.concurrent.CopyOnWriteArrayList iterator 46 20 java.util.concurrent.CopyOnWriteArrayList$ListIteratorImpl 1 java.util.concurrent.CopyOnWriteArrayList iterator 47 20 java.util.concurrent.CopyOnWriteArrayList$ListIteratorImpl 1 java.util.concurrent.CopyOnWriteArrayList iterator 48 20 java.util.concurrent.CopyOnWriteArrayList$ListIteratorImpl 1 java.util.concurrent.CopyOnWriteArrayList iterator 49 20 java.util.concurrent.CopyOnWriteArrayList$ListIteratorImpl 1 java.util.concurrent.CopyOnWriteArrayList iterator 50 20 java.util.concurrent.CopyOnWriteArrayList$ListIteratorImpl 1 java.util.concurrent.CopyOnWriteArrayList iterator 51 20 java.util.concurrent.CopyOnWriteArrayList$ListIteratorImpl 1 java.util.concurrent.CopyOnWriteArrayList iterator 52 20 java.util.concurrent.CopyOnWriteArrayList$ListIteratorImpl 1 java.util.concurrent.CopyOnWriteArrayList iterator 53 20 java.util.concurrent.CopyOnWriteArrayList$ListIteratorImpl 1 java.util.concurrent.CopyOnWriteArrayList iterator 54 20 java.util.concurrent.CopyOnWriteArrayList$ListIteratorImpl 1 java.util.concurrent.CopyOnWriteArrayList iterator 55 20 java.util.concurrent.CopyOnWriteArrayList$ListIteratorImpl 1 java.util.concurrent.CopyOnWriteArrayList iterator 56 20 java.util.concurrent.CopyOnWriteArrayList$ListIteratorImpl 1 java.util.concurrent.CopyOnWriteArrayList iterator 57 20 java.util.concurrent.CopyOnWriteArrayList$ListIteratorImpl 1 java.util.concurrent.CopyOnWriteArrayList iterator 58 20 java.util.concurrent.CopyOnWriteArrayList$ListIteratorImpl 1 java.util.concurrent.CopyOnWriteArrayList iterator 59 20 java.util.concurrent.CopyOnWriteArrayList$ListIteratorImpl 1 java.util.concurrent.CopyOnWriteArrayList iterator 60 20 java.util.concurrent.CopyOnWriteArrayList$ListIteratorImpl 1 java.util.concurrent.CopyOnWriteArrayList iterator 61 20 java.util.concurrent.CopyOnWriteArrayList$ListIteratorImpl 1 java.util.concurrent.CopyOnWriteArrayList iterator 62 20 java.util.concurrent.CopyOnWriteArrayList$ListIteratorImpl 1 java.util.concurrent.CopyOnWriteArrayList iterator 63 20 java.util.concurrent.CopyOnWriteArrayList$ListIteratorImpl 1 java.util.concurrent.CopyOnWriteArrayList iterator 64 20 java.util.concurrent.CopyOnWriteArrayList$ListIteratorImpl 1 java.util.concurrent.CopyOnWriteArrayList iterator 65 20 java.util.concurrent.CopyOnWriteArrayList$ListIteratorImpl 1 java.util.concurrent.CopyOnWriteArrayList iterator 66 20 java.util.concurrent.CopyOnWriteArrayList$ListIteratorImpl 1 java.util.concurrent.CopyOnWriteArrayList iterator 67 20 java.util.concurrent.CopyOnWriteArrayList$ListIteratorImpl 1 java.util.concurrent.CopyOnWriteArrayList iterator 68 20 java.util.concurrent.CopyOnWriteArrayList$ListIteratorImpl 1 java.util.concurrent.CopyOnWriteArrayList iterator 69 20 java.util.concurrent.CopyOnWriteArrayList$ListIteratorImpl 1 java.util.concurrent.CopyOnWriteArrayList iterator 70 20 java.util.concurrent.CopyOnWriteArrayList$ListIteratorImpl 1 java.util.concurrent.CopyOnWriteArrayList iterator 71 20 java.util.concurrent.CopyOnWriteArrayList$ListIteratorImpl 1 java.util.concurrent.CopyOnWriteArrayList iterator 72 20 java.util.concurrent.CopyOnWriteArrayList$ListIteratorImpl 1 java.util.concurrent.CopyOnWriteArrayList iterator 73 20 java.util.concurrent.CopyOnWriteArrayList$ListIteratorImpl 1 java.util.concurrent.CopyOnWriteArrayList iterator 74 24 java.lang.ref.SoftReference 1 android.view.View buildDrawingCache 75 36 android.graphics.Bitmap 1 android.graphics.Bitmap nativeCreate 76 20 java.util.concurrent.CopyOnWriteArrayList$ListIteratorImpl 1 java.util.concurrent.CopyOnWriteArrayList iterator 77 24 java.lang.ref.SoftReference 1 android.view.View buildDrawingCache 78 36 android.graphics.Bitmap 1 android.graphics.Bitmap nativeCreate 79 24 java.lang.ref.SoftReference 1 android.view.View buildDrawingCache 80 36 android.graphics.Bitmap 1 android.graphics.Bitmap nativeCreate 81 8 com.android.internal.os.BinderInternal$GcWatcher 2 com.android.internal.os.BinderInternal$GcWatcher finalize 82 24 java.lang.ref.WeakReference 2 com.android.internal.os.BinderInternal$GcWatcher finalize 83 20 java.util.concurrent.CopyOnWriteArrayList$ListIteratorImpl 1 java.util.concurrent.CopyOnWriteArrayList iterator 84 20 java.util.concurrent.CopyOnWriteArrayList$ListIteratorImpl 1 java.util.concurrent.CopyOnWriteArrayList iterator 85 20 java.util.concurrent.CopyOnWriteArrayList$ListIteratorImpl 1 java.util.concurrent.CopyOnWriteArrayList iterator 86 20 java.util.concurrent.CopyOnWriteArrayList$ListIteratorImpl 1 java.util.concurrent.CopyOnWriteArrayList iterator 87 20 java.util.concurrent.CopyOnWriteArrayList$ListIteratorImpl 1 java.util.concurrent.CopyOnWriteArrayList iterator 88 20 java.util.concurrent.CopyOnWriteArrayList$ListIteratorImpl 1 java.util.concurrent.CopyOnWriteArrayList iterator 89 24 java.lang.ref.SoftReference 1 android.view.View buildDrawingCache 90 36 android.graphics.Bitmap 1 android.graphics.Bitmap nativeCreate 91 24 java.lang.ref.SoftReference 1 android.view.View buildDrawingCache 92 36 android.graphics.Bitmap 1 android.graphics.Bitmap nativeCreate 93 20 java.util.concurrent.CopyOnWriteArrayList$ListIteratorImpl 1 java.util.concurrent.CopyOnWriteArrayList iterator 94 24 java.lang.ref.SoftReference 1 android.view.View buildDrawingCache 95 36 android.graphics.Bitmap 1 android.graphics.Bitmap nativeCreate 96 8 com.android.internal.os.BinderInternal$GcWatcher 2 com.android.internal.os.BinderInternal$GcWatcher finalize 97 24 java.lang.ref.WeakReference 2 com.android.internal.os.BinderInternal$GcWatcher finalize 98 24 java.lang.ref.SoftReference 1 android.view.View buildDrawingCache 99 36 android.graphics.Bitmap 1 android.graphics.Bitmap nativeCreate 100 20 java.util.concurrent.CopyOnWriteArrayList$ListIteratorImpl 1 java.util.concurrent.CopyOnWriteArrayList iterator 101 24 java.lang.ref.SoftReference 1 android.view.View buildDrawingCache 102 36 android.graphics.Bitmap 1 android.graphics.Bitmap nativeCreate 103 24 java.lang.ref.SoftReference 1 android.view.View buildDrawingCache 104 36 android.graphics.Bitmap 1 android.graphics.Bitmap nativeCreate 105 8 com.android.internal.os.BinderInternal$GcWatcher 2 com.android.internal.os.BinderInternal$GcWatcher finalize 106 24 java.lang.ref.WeakReference 2 com.android.internal.os.BinderInternal$GcWatcher finalize 107 20 java.util.concurrent.CopyOnWriteArrayList$ListIteratorImpl 1 java.util.concurrent.CopyOnWriteArrayList iterator 108 24 java.lang.ref.SoftReference 1 android.view.View buildDrawingCache 109 36 android.graphics.Bitmap 1 android.graphics.Bitmap nativeCreate 110 24 java.lang.ref.SoftReference 1 android.view.View buildDrawingCache 111 36 android.graphics.Bitmap 1 android.graphics.Bitmap nativeCreate 112 24 java.lang.ref.SoftReference 1 android.view.View buildDrawingCache 113 36 android.graphics.Bitmap 1 android.graphics.Bitmap nativeCreate 114 8 com.android.internal.os.BinderInternal$GcWatcher 2 com.android.internal.os.BinderInternal$GcWatcher finalize 115 24 java.lang.ref.WeakReference 2 com.android.internal.os.BinderInternal$GcWatcher finalize 116 24 java.lang.ref.SoftReference 1 android.view.View buildDrawingCache 117 36 android.graphics.Bitmap 1 android.graphics.Bitmap nativeCreate 118 20 java.util.concurrent.CopyOnWriteArrayList$ListIteratorImpl 1 java.util.concurrent.CopyOnWriteArrayList iterator 119 60 com.carrieriq.iqagent.client.metrics.ui.UI11 1 android.view.ViewRoot submitPointerMetrics 120 24 java.lang.ref.SoftReference 1 android.view.View buildDrawingCache 121 36 android.graphics.Bitmap 1 android.graphics.Bitmap nativeCreate 122 24 java.lang.ref.SoftReference 1 android.view.View buildDrawingCache 123 36 android.graphics.Bitmap 1 android.graphics.Bitmap nativeCreate 124 8 com.android.internal.os.BinderInternal$GcWatcher 2 com.android.internal.os.BinderInternal$GcWatcher finalize 125 24 java.lang.ref.WeakReference 2 com.android.internal.os.BinderInternal$GcWatcher finalize 126 24 java.lang.ref.SoftReference 1 android.view.View buildDrawingCache 127 36 android.graphics.Bitmap 1 android.graphics.Bitmap nativeCreate 128 20 java.util.concurrent.CopyOnWriteArrayList$ListIteratorImpl 1 java.util.concurrent.CopyOnWriteArrayList iterator 129 60 com.carrieriq.iqagent.client.metrics.ui.UI11 1 android.view.ViewRoot submitPointerMetrics 130 24 java.lang.ref.SoftReference 1 android.view.View buildDrawingCache 131 36 android.graphics.Bitmap 1 android.graphics.Bitmap nativeCreate 132 24 java.lang.ref.SoftReference 1 android.view.View buildDrawingCache 133 36 android.graphics.Bitmap 1 android.graphics.Bitmap nativeCreate 134 8 com.android.internal.os.BinderInternal$GcWatcher 2 com.android.internal.os.BinderInternal$GcWatcher finalize 135 24 java.lang.ref.WeakReference 2 com.android.internal.os.BinderInternal$GcWatcher finalize 136 24 java.lang.ref.SoftReference 1 android.view.View buildDrawingCache 137 36 android.graphics.Bitmap 1 android.graphics.Bitmap nativeCreate 138 24 java.lang.ref.SoftReference 1 android.view.View buildDrawingCache 139 36 android.graphics.Bitmap 1 android.graphics.Bitmap nativeCreate 140 20 java.util.concurrent.CopyOnWriteArrayList$ListIteratorImpl 1 java.util.concurrent.CopyOnWriteArrayList iterator 141 60 com.carrieriq.iqagent.client.metrics.ui.UI11 1 android.view.ViewRoot submitPointerMetrics 142 60 com.carrieriq.iqagent.client.metrics.ui.UI11 1 android.view.ViewRoot submitPointerMetrics 143 60 com.carrieriq.iqagent.client.metrics.ui.UI11 1 android.view.ViewRoot submitPointerMetrics 144 20 java.util.ArrayList 19 android.os.MessageQueue &lt;init&gt; 145 36 android.os.MessageQueue 19 android.os.Looper &lt;init&gt; 146 24 android.os.Looper 19 android.os.Looper prepare 147 144 java.lang.Object[] 19 java.lang.ThreadLocal$Values initializeTable 148 32 java.lang.ThreadLocal$Values 19 java.lang.ThreadLocal initializeValues 149 16 java.lang.VMThread 1 java.lang.VMThread create 150 40 java.util.WeakHashMap$Entry 1 java.util.WeakHashMap put 151 16 java.security.ProtectionDomain[] 1 java.security.AccessControlContext &lt;init&gt; 152 20 java.security.AccessControlContext 1 java.security.AccessController getContext 153 16 java.security.ProtectionDomain[] 1 java.security.AccessController getStackDomains 154 24 java.lang.String 1 java.lang.AbstractStringBuilder toString 155 48 char[] 1 java.lang.AbstractStringBuilder &lt;init&gt; 156 20 java.lang.StringBuilder 1 java.lang.Thread create 157 16 android.view.ViewRoot$2 1 android.view.ViewRoot handleLongPress 158 80 java.lang.Thread 1 android.view.ViewRoot handleLongPress 159 60 com.carrieriq.iqagent.client.metrics.ui.UI11 1 android.view.ViewRoot submitPointerMetrics 160 24 org.apache.harmony.dalvik.ddmc.Chunk 5 android.ddm.DdmHandleHeap handleREAQ 161 17 byte[] 5 android.ddm.DdmHandleHeap handleREAQ 162 24 org.apache.harmony.dalvik.ddmc.Chunk 5 org.apache.harmony.dalvik.ddmc.DdmServer dispatch 163 12 java.lang.Integer 5 java.lang.Integer valueOf 164 24 byte[] 5 dalvik.system.NativeStart run </code></pre> <p>As you can see, the events directly preceding GC and happening in between every GC, are pretty much as follows:</p> <pre><code>107 20 java.util.concurrent.CopyOnWriteArrayList$ListIteratorImpl 1 java.util.concurrent.CopyOnWriteArrayList iterator 108 24 java.lang.ref.SoftReference 1 android.view.View buildDrawingCache 109 36 android.graphics.Bitmap 1 android.graphics.Bitmap nativeCreate 110 24 java.lang.ref.SoftReference 1 android.view.View buildDrawingCache 111 36 android.graphics.Bitmap 1 android.graphics.Bitmap nativeCreate 112 24 java.lang.ref.SoftReference 1 android.view.View buildDrawingCache 113 36 android.graphics.Bitmap 1 android.graphics.Bitmap nativeCreate 114 8 com.android.internal.os.BinderInternal$GcWatcher 2 com.android.internal.os.BinderInternal$GcWatcher finalize 115 24 java.lang.ref.WeakReference 2 com.android.internal.os.BinderInternal$GcWatcher finalize </code></pre> <p>I really wish the allocation tracker let me export the whole dump with individual stack traces, but it doesn't, so I'll paste a few stack traces here, most of which have to do with drawing:</p> <p>android.graphics.Bitmap:</p> <pre><code>android.graphics.Bitmap nativeCreate Bitmap.java -2 true android.graphics.Bitmap createBitmap Bitmap.java 477 false android.view.View buildDrawingCache View.java 6716 false android.view.View getDrawingCache View.java 6567 false android.view.ViewGroup drawChild ViewGroup.java 1571 false android.view.ViewGroup dispatchDraw ViewGroup.java 1373 false android.widget.AbsListView dispatchDraw AbsListView.java 1627 false android.widget.GridView dispatchDraw GridView.java 1943 false android.view.View draw View.java 7022 false android.widget.AbsListView draw AbsListView.java 3005 false android.view.ViewGroup drawChild ViewGroup.java 1646 false android.view.ViewGroup dispatchDraw ViewGroup.java 1373 false android.view.View draw View.java 7022 false android.view.ViewGroup drawChild ViewGroup.java 1646 false android.view.ViewGroup dispatchDraw ViewGroup.java 1373 false android.view.ViewGroup drawChild ViewGroup.java 1644 false </code></pre> <p>java.util.concurrent.CopyOnWriteArrayList:</p> <pre><code>java.util.concurrent.CopyOnWriteArrayList iterator CopyOnWriteArrayList.java 332 false android.view.ViewTreeObserver dispatchOnPreDraw ViewTreeObserver.java 570 false android.view.ViewRoot performTraversals ViewRoot.java 1293 false android.view.ViewRoot handleMessage ViewRoot.java 1899 false android.os.Handler dispatchMessage Handler.java 99 false android.os.Looper loop Looper.java 130 false android.app.ActivityThread main ActivityThread.java 3691 false java.lang.reflect.Method invokeNative Method.java -2 true java.lang.reflect.Method invoke Method.java 507 false com.android.internal.os.ZygoteInit$MethodAndArgsCaller run ZygoteInit.java 907 false com.android.internal.os.ZygoteInit main ZygoteInit.java 665 false dalvik.system.NativeStart main NativeStart.java -2 true </code></pre> <p>Here is my GridView container XML:</p> <pre><code>&lt;?xml version="1.0" encoding="utf-8"?&gt; &lt;LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="fill_parent" android:orientation="vertical" &gt; &lt;LinearLayout android:id="@+id/scroll_items_holder" android:layout_width="fill_parent" android:layout_height="fill_parent" android:layout_weight="1" android:background="@drawable/app_bg" android:orientation="vertical" &gt; &lt;LinearLayout android:id="@+id/buttonsLayout" android:layout_width="fill_parent" android:layout_height="wrap_content" android:gravity="center" &gt; &lt;/LinearLayout&gt; &lt;GridView android:id="@+id/gridview" android:layout_width="fill_parent" android:layout_height="wrap_content" android:columnWidth="150dp" android:gravity="right" android:horizontalSpacing="0dp" android:listSelector="@null" android:numColumns="auto_fit" android:paddingLeft="5dp" android:paddingRight="5dp" android:stretchMode="columnWidth" android:verticalSpacing="10dp" /&gt; &lt;/LinearLayout&gt; &lt;include layout="@layout/menu_bar_inc" /&gt; &lt;/LinearLayout&gt; </code></pre> <p>XML file for each GridView cell: </p> <pre><code>&lt;?xml version="1.0" encoding="utf-8"?&gt; &lt;LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/card" android:layout_width="fill_parent" android:layout_height="wrap_content" android:orientation="vertical" &gt; &lt;ImageView android:id="@+id/thumbnail" android:layout_width="fill_parent" android:layout_height="120dp" android:layout_marginLeft="5dp" android:layout_marginRight="5dp" android:layout_marginTop="5dp" android:scaleType="centerCrop" /&gt; &lt;TextView android:id="@+id/show_name" android:layout_width="fill_parent" android:layout_height="wrap_content" android:layout_marginLeft="5dp" android:layout_marginRight="5dp" android:ellipsize="marquee" android:maxLines="1" android:textColor="@color/white" android:textStyle="bold" /&gt; &lt;/LinearLayout&gt; </code></pre> <p>Adapter, most of which is commented out:</p> <pre><code>package com.tunerfish.tunerfish.adapters; import java.util.ArrayList; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.BaseAdapter; import android.widget.TextView; import com.tunerfish.tunerfish.core.TfHomeActivity; import com.tunerfish.tunerfish.databasemanager.dataitem.EntityDataItem; import com.tunerfish.tunerfish.ui.R; public class TrendingGalleryAdapter extends BaseAdapter { // structure for dumb view holders public static class ViewHolder { public TextView showName; // public ImageViewWithLoader thumbnail; } // structure for actual data behind the ListView public static class EntityData { public EntityDataItem entityDataItem; } public final ArrayList&lt;EntityData&gt; mEntityDataList; private final LayoutInflater mInflater; public TrendingGalleryAdapter(TfHomeActivity context, ArrayList&lt;EntityData&gt; entityData) { mContext = context; mInflater = LayoutInflater.from(context); mEntityDataList = entityData; } @Override public int getCount() { return mEntityDataList.size(); } @Override public EntityData getItem(int position) { return mEntityDataList.get(position); } @Override public long getItemId(int position) { return position; } private final TfHomeActivity mContext; @Override public View getView(final int position, View inView, ViewGroup parent) { ViewHolder holder; if (inView == null) { holder = new ViewHolder(); inView = mInflater.inflate(R.layout.trending_item_mod, null); holder.showName = (TextView) inView.findViewById(R.id.show_name); // holder.thumbnail = (ImageViewWithLoader) inView.findViewById(R.id.thumbnail); inView.setTag(holder); } else { holder = (ViewHolder) inView.getTag(); } // reset some stuff // holder.thumbnail.getImageView().setImageBitmap(null); // holder.showName.setText(getItem(position).entityDataItem.getTitle()); // deal with thumbnails String thumbnailUrl = getItem(position).entityDataItem.getTrendingThumbnail(); // mContext.sendImgDownloadRequest(thumbnailUrl, holder.thumbnail.getImageView(), R.drawable.tunerfish_details_logo2); return inView; } } </code></pre> <p>So, this question may look long, but I wanted to include as much info as possible. I found a possibly related ListView issue <a href="https://stackoverflow.com/questions/5977718/lots-of-garbage-collection-in-a-listview">Lots of garbage collection in a listview</a> but unfortunately it doesn't seem to apply to GridViews.</p> <p>Additionally, it doesn't seem like I'm alone with this problem - a friend of mine contacted me to ask about exactly the same issue in his app, completely independently.</p> <p>My test devices are OG Droid running CM 7.1 and Epic 4G Touch running stock Gingerbread.</p> <p>So is this a framework bug? Am I doing something wrong? Am I not including a certain parameter?</p> <p>Thank you.</p>
    singulars
    1. This table or related slice is empty.
    plurals
    1. This table or related slice is empty.
    1. This table or related slice is empty.
 

Querying!

 
Guidance

SQuiL has stopped working due to an internal error.

If you are curious you may find further information in the browser console, which is accessible through the devtools (F12).

Reload