问题描述
我一直在寻找这个了很久,最后决定后 - 我的2×N个GridView控件,它由细胞单个图像和一段文字,是非常不连贯了很多次(但有时完美流畅)。经检查logcat的输出,我看到这样的事情,一旦我开始滚动(只有12列表中的项目):
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):
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 <1K, 47% free 3383K/6279K, external 2044K/2161K, paused 36ms
10-25 17:28:40.600: D/dalvikvm(12159): GC_EXTERNAL_ALLOC freed <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 <1K, 47% free 3383K/6279K, external 2044K/2161K, paused 25ms
10-25 17:28:41.880: D/dalvikvm(12159): GC_EXTERNAL_ALLOC freed <1K, 47% free 3383K/6279K, external 2044K/2161K, paused 25ms
10-25 17:28:41.910: D/dalvikvm(12159): GC_EXTERNAL_ALLOC freed <1K, 47% free 3383K/6279K, external 2044K/2161K, paused 20ms
10-25 17:28:41.940: D/dalvikvm(12159): GC_EXTERNAL_ALLOC freed <1K, 47% free 3383K/6279K, external 2044K/2161K, paused 18ms
此是只有一个单一的轻拂到列表的底部和备份。很不稳定。如果我继续上下滚动,GC的不断持续的,也许5-6滚动,然后停止。但只要我preSS菜单,它会弹出一个2输入菜单或交换机的活动回来,GC回来了。
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.
我关掉位图分配的图像 - 同样的问题。我的细胞基本上是空的,但GC仍然发生。
I turned off bitmap assignments for the image - same problem. My cells are essentially empty, yet GC still happens.
我联系罗曼盖伊谁说我应该尝试分配跟踪。我跑了跟踪和轻弹,但看到我自己的code无分配。我确实看到分配随后调用com.android.internal.os.BinderInternal $ GcWatcher分配敲定,其中在GC的logcat线的数量相匹配。这里是整个分配跟踪转储(或作为图片哪一个更容易解析):
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 as a picture which is easier to parse):
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 <init>
145 36 android.os.MessageQueue 19 android.os.Looper <init>
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 <init>
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 <init>
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
正如你所看到的,事件直接preceding GC和GC每间发生的事情,是pretty的多少如下:
As you can see, the events directly preceding GC and happening in between every GC, are pretty much as follows:
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
我真的希望配置跟踪让我导出整个转储个别堆栈跟踪,但它没有,所以我会贴上一些堆栈跟踪,在这里,其中大部分都与图:
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:
android.graphics.Bitmap:
android.graphics.Bitmap:
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
java.util.concurrent.CopyOnWriteArrayList中的:
java.util.concurrent.CopyOnWriteArrayList:
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
下面是我的GridView控件容器的XML:
Here is my GridView container XML:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical" >
<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" >
<LinearLayout
android:id="@+id/buttonsLayout"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:gravity="center" >
</LinearLayout>
<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" />
</LinearLayout>
<include layout="@layout/menu_bar_inc" />
</LinearLayout>
对于每个GridView的单元格的XML文件:
XML file for each GridView cell:
<?xml version="1.0" encoding="utf-8"?>
<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" >
<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" />
<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" />
</LinearLayout>
适配器,其中大部分被注释掉:
Adapter, most of which is commented out:
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<EntityData> mEntityDataList;
private final LayoutInflater mInflater;
public TrendingGalleryAdapter(TfHomeActivity context, ArrayList<EntityData> 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;
}
}
所以,这个问题可能看起来很长,但我想包括尽可能多的信息。我发现了一个可能与ListView的问题大量的垃圾收集在一个列表视图但不幸的是它似乎并不适用于GridView的。
So, this question may look long, but I wanted to include as much info as possible. I found a possibly related ListView issue Lots of garbage collection in a listview but unfortunately it doesn't seem to apply to GridViews.
此外,它似乎并不像我独自面对这样的问题 - 我的一个朋友与我联系,询问有关完全相同的问题,在他的应用程序,完全独立
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.
我的测试设备OG的Droid运行CM 7.1和Epic 4G触摸运行的股票姜饼。
My test devices are OG Droid running CM 7.1 and Epic 4G Touch running stock Gingerbread.
因此,这是一个框架的错误?难道我做错了什么?难道我不包括在一定的参数?
So is this a framework bug? Am I doing something wrong? Am I not including a certain parameter?
感谢你。
推荐答案
在尝试了随机更多的事情,我相信我能够通过设置GridView的 scrollingCache
到假。它现在黄油顺利。
After trying out more things at random, I believe I was able to solve the issue by setting GridView's scrollingCache
to false
in the XML. It's now buttery smooth.
http://developer.android.com/reference/android/widget/AbsListView.html#attr_android:scrollingCache
所以,这应该使GridView的使用更多的内存和缓存画其实更快的设置通过使波涛汹涌的原因只是由于GC相反。打开缓存关闭使用较少的内存,而不是波涛汹涌了。
So, a setting that is supposed to make the GridView use more memory and draw from cache faster in fact causes just the opposite due to GC by making it choppy. Turning the cache off uses less memory and isn't choppy anymore.
这是一个双赢的在我的书,我希望它可以帮助别人的未来(ಠ_ಠ谷歌)。
This is a win-win in my book, and I hope it helps someone in the future (ಠ_ಠ Google).
修改:刚在一个体面的表现ListView中,偶尔会打电话GC_EXTERNAL_ALLOC释放少量内存。从一个ListView删除它摆脱了许多微小的GC_EXTERNAL_ALLOC电话干脆,只偶尔较大GC_CONCURRENT呼叫离开了。现在,一个体面绩效的ListView是一个伟大的表现的ListView。因此, scrollingCache
似乎有什么东西,以避免任何名单,不应该被默认启用IMO。
Edit: Just tried it on a decently-performing ListView, which occasionally would call GC_EXTERNAL_ALLOC to free small amounts of memory. Removing it from a ListView got rid of many tiny GC_EXTERNAL_ALLOC calls altogether and only an occasional larger GC_CONCURRENT call is left. Now a decently-performing ListView is a great-performing ListView. So scrollingCache
seems to be something to avoid in any list and shouldn't be enabled by default IMO.
这篇关于Android的GridView的垃圾收集(GC_EXTERNAL_ALLOC)&LT; 1K虚假的热情,从而导致非常不连贯的用户界面的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!