2011-03-13 23 views
1

我有一個應用程序不斷收到ANR在一個特定的組件,我不知道什麼是CPU佔用時間。最近我得到了兩種ANR,一種土着和一種等待。需要一些關於這個經常性問題的見解,ANR keyDispatchingTimedOut

DALVIK THREADS: 
"main" prio=5 tid=1 NATIVE 
    | group="main" sCount=1 dsCount=0 s=N obj=0x4001d8c0 self=0xccc8 
    | sysTid=10569 nice=0 sched=0/0 cgrp=default handle=-1345017816 
    | schedstat=(9041503981 6690216078 17225) 
    at android.view.Surface.lockCanvasNative(Native Method) 
    at android.view.Surface.lockCanvas(Surface.java:314) 
    at android.view.SurfaceView$3.internalLockCanvas(SurfaceView.java:773) 
    at android.view.SurfaceView$3.lockCanvas(SurfaceView.java:756) 
    at com.dane.hud.Surfaceview$DrawThread.run(Surfaceview.java:776) 
    at com.dane.hud.Surfaceview.onTouchEvent(Surfaceview.java:322) 
    at android.view.View.dispatchTouchEvent(View.java:3766) 
    at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:936) 
    at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:936) 
    at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:936) 
    at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:936) 
    at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:936) 
    at com.android.internal.policy.impl.PhoneWindow$DecorView.superDispatchTouchEvent(PhoneWindow.java:1671) 
    at com.android.internal.policy.impl.PhoneWindow.superDispatchTouchEvent(PhoneWindow.java:1107) 
    at android.app.Activity.dispatchTouchEvent(Activity.java:2086) 
    at com.android.internal.policy.impl.PhoneWindow$DecorView.dispatchTouchEvent(PhoneWindow.java:1655) 
    at android.view.ViewRoot.handleMessage(ViewRoot.java:1785) 
    at android.os.Handler.dispatchMessage(Handler.java:99) 
    at android.os.Looper.loop(Looper.java:123) 
    at android.app.ActivityThread.main(ActivityThread.java:4627) 
    at java.lang.reflect.Method.invokeNative(Native Method) 
    at java.lang.reflect.Method.invoke(Method.java:521) 
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:858) 
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616) 
    at dalvik.system.NativeStart.main(Native Method) 

"Binder Thread #3" prio=5 tid=9 NATIVE 
    | group="main" sCount=1 dsCount=0 s=N obj=0x44821de0 self=0x2b9b78 
    | sysTid=10585 nice=0 sched=0/0 cgrp=default handle=2857768 
    | schedstat=(726806597 708740243 2395) 
    at dalvik.system.NativeStart.run(Native Method) 

"Binder Thread #2" prio=5 tid=6 NATIVE 
    | group="main" sCount=1 dsCount=0 s=N obj=0x4476c5e8 self=0x13cbf8 
    | sysTid=10574 nice=0 sched=0/0 cgrp=default handle=1213280 
    | schedstat=(767669649 687500005 2512) 
    at dalvik.system.NativeStart.run(Native Method) 

"Binder Thread #1" prio=5 tid=5 NATIVE 
    | group="main" sCount=1 dsCount=0 s=N obj=0x4476b310 self=0x126f90 
    | sysTid=10573 nice=0 sched=0/0 cgrp=default handle=1208144 
    | schedstat=(749938913 622802748 2497) 
    at dalvik.system.NativeStart.run(Native Method) 

"Compiler" daemon prio=5 tid=4 VMWAIT 
    | group="system" sCount=1 dsCount=0 s=N obj=0x447652a0 self=0x125b80 
    | sysTid=10572 nice=0 sched=0/0 cgrp=default handle=1251720 
    | schedstat=(999145549 669586193 5169) 
    at dalvik.system.NativeStart.run(Native Method) 

"Signal Catcher" daemon prio=5 tid=3 RUNNABLE 
    | group="system" sCount=0 dsCount=0 s=N obj=0x447651e8 self=0x121988 
    | sysTid=10571 nice=0 sched=0/0 cgrp=default handle=1251656 
    | schedstat=(16204836 16693113 8) 
    at dalvik.system.NativeStart.run(Native Method) 

"HeapWorker" daemon prio=5 tid=2 VMWAIT 
    | group="system" sCount=1 dsCount=0 s=N obj=0x431a9650 self=0x1317c0 
    | sysTid=10570 nice=0 sched=0/0 cgrp=default handle=1172520 
    | schedstat=(28203003083 34572570617 10984) 
    at dalvik.system.NativeStart.run(Native Method) 

DALVIK THREADS: 
"main" prio=5 tid=1 WAIT 
    | group="main" sCount=1 dsCount=0 s=N obj=0x4001d8c0 self=0xccc8 
    | sysTid=2428 nice=0 sched=0/0 cgrp=default handle=-1345017816 
    | schedstat=(5054412632 4232574644 11781) 
    at java.lang.Object.wait(Native Method) 
    - waiting on <0x4001d950> (a java.lang.VMThread) 
    at java.lang.Thread.parkFor(Thread.java:1535) 
    at java.lang.LangAccessImpl.parkFor(LangAccessImpl.java:48) 
    at sun.misc.Unsafe.park(Unsafe.java:317) 
    at java.util.concurrent.locks.LockSupport.park(LockSupport.java:131) 
    at java.util.concurrent.locks.AbstractQueuedSynchronizer.parkAndCheckInterrupt(AbstractQueuedSynchronizer.java:790) 
    at java.util.concurrent.locks.AbstractQueuedSynchronizer.acquireQueued(AbstractQueuedSynchronizer.java:823) 
    at java.util.concurrent.locks.AbstractQueuedSynchronizer.acquire(AbstractQueuedSynchronizer.java:1153) 
    at java.util.concurrent.locks.ReentrantLock$NonfairSync.lock(ReentrantLock.java:185) 
    at java.util.concurrent.locks.ReentrantLock.lock(ReentrantLock.java:261) 
    at android.view.SurfaceView$3.internalLockCanvas(SurfaceView.java:764) 
    at android.view.SurfaceView$3.lockCanvas(SurfaceView.java:756) 
    at com.dane.hud.Surfaceview$DrawThread.run(Surfaceview.java:776) 
    at com.dane.hud.Surfaceview.onTouchEvent(Surfaceview.java:319) 
    at android.view.View.dispatchTouchEvent(View.java:3766) 
    at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:936) 
    at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:936) 
    at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:936) 
    at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:936) 
    at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:936) 
    at com.android.internal.policy.impl.PhoneWindow$DecorView.superDispatchTouchEvent(PhoneWindow.java:1671) 
    at com.android.internal.policy.impl.PhoneWindow.superDispatchTouchEvent(PhoneWindow.java:1107) 
    at android.app.Activity.dispatchTouchEvent(Activity.java:2086) 
    at com.android.internal.policy.impl.PhoneWindow$DecorView.dispatchTouchEvent(PhoneWindow.java:1655) 
    at android.view.ViewRoot.handleMessage(ViewRoot.java:1785) 
    at android.os.Handler.dispatchMessage(Handler.java:99) 
    at android.os.Looper.loop(Looper.java:123) 
    at android.app.ActivityThread.main(ActivityThread.java:4627) 
    at java.lang.reflect.Method.invokeNative(Native Method) 
    at java.lang.reflect.Method.invoke(Method.java:521) 
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:858) 
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616) 
    at dalvik.system.NativeStart.main(Native Method) 

"Thread-448" prio=5 tid=16 WAIT 
    | group="main" sCount=1 dsCount=0 s=N obj=0x447e4b40 self=0x2e5960 
    | sysTid=2892 nice=0 sched=0/0 cgrp=default handle=3037856 
    | schedstat=(495635974 519531260 463) 
    at java.lang.Object.wait(Native Method) 
    - waiting on <0x447eeb10> (a java.lang.VMThread) 
    at java.lang.Thread.parkFor(Thread.java:1535) 
    at java.lang.LangAccessImpl.parkFor(LangAccessImpl.java:48) 
    at sun.misc.Unsafe.park(Unsafe.java:317) 
    at java.util.concurrent.locks.LockSupport.park(LockSupport.java:131) 
    at java.util.concurrent.locks.AbstractQueuedSynchronizer.parkAndCheckInterrupt(AbstractQueuedSynchronizer.java:790) 
    at java.util.concurrent.locks.AbstractQueuedSynchronizer.acquireQueued(AbstractQueuedSynchronizer.java:823) 
    at java.util.concurrent.locks.AbstractQueuedSynchronizer.acquire(AbstractQueuedSynchronizer.java:1153) 
    at java.util.concurrent.locks.ReentrantLock$NonfairSync.lock(ReentrantLock.java:185) 
    at java.util.concurrent.locks.ReentrantLock.lock(ReentrantLock.java:261) 
    at android.view.SurfaceView$3.internalLockCanvas(SurfaceView.java:764) 
    at android.view.SurfaceView$3.lockCanvas(SurfaceView.java:756) 
    at com.dane.hud.Surfaceview$DrawThread.run(Surfaceview.java:776) 
    at com.dane.hud.HUD.updateWithNewLocation(HUD.java:639) 
    at com.dane.hud.HUD.access$3(HUD.java:618) 
    at com.dane.hud.HUD$updateEverythingFromGPS.run(HUD.java:573) 

"Thread-447" prio=5 tid=15 WAIT 
    | group="main" sCount=1 dsCount=0 s=N obj=0x447fb5f0 self=0x2bd690 
    | sysTid=2890 nice=0 sched=0/0 cgrp=default handle=2873296 
    | schedstat=(636688219 727813733 545) 
    at java.lang.Object.wait(Native Method) 
    - waiting on <0x447fb780> (a java.lang.VMThread) 
    at java.lang.Thread.parkFor(Thread.java:1535) 
    at java.lang.LangAccessImpl.parkFor(LangAccessImpl.java:48) 
    at sun.misc.Unsafe.park(Unsafe.java:317) 
    at java.util.concurrent.locks.LockSupport.park(LockSupport.java:131) 
    at java.util.concurrent.locks.AbstractQueuedSynchronizer.parkAndCheckInterrupt(AbstractQueuedSynchronizer.java:790) 
    at java.util.concurrent.locks.AbstractQueuedSynchronizer.acquireQueued(AbstractQueuedSynchronizer.java:823) 
    at java.util.concurrent.locks.AbstractQueuedSynchronizer.acquire(AbstractQueuedSynchronizer.java:1153) 
    at java.util.concurrent.locks.ReentrantLock$NonfairSync.lock(ReentrantLock.java:185) 
    at java.util.concurrent.locks.ReentrantLock.lock(ReentrantLock.java:261) 
    at android.view.SurfaceView$3.internalLockCanvas(SurfaceView.java:764) 
    at android.view.SurfaceView$3.lockCanvas(SurfaceView.java:756) 
    at com.dane.hud.Surfaceview$DrawThread.run(Surfaceview.java:776) 
    at com.dane.hud.HUD.updateWithNewLocation(HUD.java:639) 
    at com.dane.hud.HUD.access$3(HUD.java:618) 
    at com.dane.hud.HUD$updateEverythingFromGPS.run(HUD.java:573) 

"Thread-446" prio=5 tid=14 WAIT 
    | group="main" sCount=1 dsCount=0 s=N obj=0x44823a68 self=0x2ccac0 
    | sysTid=2889 nice=0 sched=0/0 cgrp=default handle=2874496 
    | schedstat=(774780280 777496325 693) 
    at java.lang.Object.wait(Native Method) 
    - waiting on <0x44786fe8> (a java.lang.VMThread) 
    at java.lang.Thread.parkFor(Thread.java:1535) 
    at java.lang.LangAccessImpl.parkFor(LangAccessImpl.java:48) 
    at sun.misc.Unsafe.park(Unsafe.java:317) 
    at java.util.concurrent.locks.LockSupport.park(LockSupport.java:131) 
    at java.util.concurrent.locks.AbstractQueuedSynchronizer.parkAndCheckInterrupt(AbstractQueuedSynchronizer.java:790) 
    at java.util.concurrent.locks.AbstractQueuedSynchronizer.acquireQueued(AbstractQueuedSynchronizer.java:823) 
    at java.util.concurrent.locks.AbstractQueuedSynchronizer.acquire(AbstractQueuedSynchronizer.java:1153) 
    at java.util.concurrent.locks.ReentrantLock$NonfairSync.lock(ReentrantLock.java:185) 
    at java.util.concurrent.locks.ReentrantLock.lock(ReentrantLock.java:261) 
    at android.view.SurfaceView$3.internalLockCanvas(SurfaceView.java:764) 
    at android.view.SurfaceView$3.lockCanvas(SurfaceView.java:756) 
    at com.dane.hud.Surfaceview$DrawThread.run(Surfaceview.java:776) 
    at com.dane.hud.HUD.updateWithNewLocation(HUD.java:639) 
    at com.dane.hud.HUD.access$3(HUD.java:618) 
    at com.dane.hud.HUD$updateEverythingFromGPS.run(HUD.java:573) 

"Thread-445" prio=5 tid=13 WAIT 
    | group="main" sCount=1 dsCount=0 s=N obj=0x447f2288 self=0x2e2a80 
    | sysTid=2888 nice=0 sched=0/0 cgrp=default handle=3026032 
    | schedstat=(831634516 815490735 696) 
    at java.lang.Object.wait(Native Method) 
    - waiting on <0x447f2418> (a java.lang.VMThread) 
    at java.lang.Thread.parkFor(Thread.java:1535) 
    at java.lang.LangAccessImpl.parkFor(LangAccessImpl.java:48) 
    at sun.misc.Unsafe.park(Unsafe.java:317) 
    at java.util.concurrent.locks.LockSupport.park(LockSupport.java:131) 
    at java.util.concurrent.locks.AbstractQueuedSynchronizer.parkAndCheckInterrupt(AbstractQueuedSynchronizer.java:790) 
    at java.util.concurrent.locks.AbstractQueuedSynchronizer.acquireQueued(AbstractQueuedSynchronizer.java:823) 
    at java.util.concurrent.locks.AbstractQueuedSynchronizer.acquire(AbstractQueuedSynchronizer.java:1153) 
    at java.util.concurrent.locks.ReentrantLock$NonfairSync.lock(ReentrantLock.java:185) 
    at java.util.concurrent.locks.ReentrantLock.lock(ReentrantLock.java:261) 
    at android.view.SurfaceView$3.internalLockCanvas(SurfaceView.java:764) 
    at android.view.SurfaceView$3.lockCanvas(SurfaceView.java:756) 
    at com.dane.hud.Surfaceview$DrawThread.run(Surfaceview.java:776) 
    at com.dane.hud.HUD.updateWithNewLocation(HUD.java:639) 
    at com.dane.hud.HUD.access$3(HUD.java:618) 
    at com.dane.hud.HUD$updateEverythingFromGPS.run(HUD.java:573) 

"Thread-444" prio=5 tid=12 WAIT 
    | group="main" sCount=1 dsCount=0 s=N obj=0x447c97c0 self=0x2c4910 
    | sysTid=2887 nice=0 sched=0/0 cgrp=default handle=2780792 
    | schedstat=(1249114988 1195007328 1038) 
    at java.lang.Object.wait(Native Method) 
    - waiting on <0x447cd918> (a java.lang.VMThread) 
    at java.lang.Thread.parkFor(Thread.java:1535) 
    at java.lang.LangAccessImpl.parkFor(LangAccessImpl.java:48) 
    at sun.misc.Unsafe.park(Unsafe.java:317) 
    at java.util.concurrent.locks.LockSupport.park(LockSupport.java:131) 
    at java.util.concurrent.locks.AbstractQueuedSynchronizer.parkAndCheckInterrupt(AbstractQueuedSynchronizer.java:790) 
    at java.util.concurrent.locks.AbstractQueuedSynchronizer.acquireQueued(AbstractQueuedSynchronizer.java:823) 
    at java.util.concurrent.locks.AbstractQueuedSynchronizer.acquire(AbstractQueuedSynchronizer.java:1153) 
    at java.util.concurrent.locks.ReentrantLock$NonfairSync.lock(ReentrantLock.java:185) 
    at java.util.concurrent.locks.ReentrantLock.lock(ReentrantLock.java:261) 
    at android.view.SurfaceView$3.internalLockCanvas(SurfaceView.java:764) 
    at android.view.SurfaceView$3.lockCanvas(SurfaceView.java:756) 
    at com.dane.hud.Surfaceview$DrawThread.run(Surfaceview.java:776) 
    at com.dane.hud.HUD.updateWithNewLocation(HUD.java:639) 
    at com.dane.hud.HUD.access$3(HUD.java:618) 
    at com.dane.hud.HUD$updateEverythingFromGPS.run(HUD.java:573) 

"Thread-443" prio=5 tid=11 VMWAIT JIT 
    | group="main" sCount=1 dsCount=0 s=Y obj=0x4480cd28 self=0x2d27b0 
    | sysTid=2886 nice=0 sched=0/0 cgrp=default handle=2959600 
    | schedstat=(1636657703 1482391360 1374) 
    at java.util.concurrent.locks.AbstractQueuedSynchronizer.addWaiter(AbstractQueuedSynchronizer.java:~562) 
    at java.util.concurrent.locks.AbstractQueuedSynchronizer.acquire(AbstractQueuedSynchronizer.java:1153) 
    at java.util.concurrent.locks.ReentrantLock$NonfairSync.lock(ReentrantLock.java:185) 
    at java.util.concurrent.locks.ReentrantLock.lock(ReentrantLock.java:261) 
    at android.view.Surfa... 

任何想法?我已經將操作移至新線程,也許我沒有調用join();在他們。

感謝您的任何幫助。

回答

5

在這裏:

http://developer.android.com/guide/practices/design/responsiveness.html

ANR是在主線程被阻塞的東西,只要操作始終是建議做的子線程:

TO報價:

因此,任何運行在 主線程中的方法都應該儘可能少做一些工作 。特別是,活動 應該儘可能少地在關鍵生命週期方法中設置 ,如 onCreate()和onResume()。潛在 長時間運行的操作,如 網絡或數據庫操作,或 計算昂貴的計算 如調整位圖應該在一個子線程來完成 (或數據庫操作的情況下 ,通過 異步請求)。但是,這個 並不意味着您的主線程 應該在等待 子線程完成時阻塞 - 也不應該調用Thread.wait()或 Thread.sleep()。在完成等待子線程爲 而不是阻止 時,主線程應爲 提供子線程的處理程序,以便在完成後發回 。 以這種方式設計您的應用程序 將允許您的主線程保持 響應輸入,從而避免由於第5個輸入 事件超時導致的對話框ANR 。對於顯示UI的任何其他 線程,應遵循這些相同的做法 ,因爲它們是 也受同樣的超時限制。

我明白這並不容易,但是從上面的建議是UI應該不在主線程中。

另一方面,您的主線程處於「WAIT」狀態,這意味着使用非異步操作。也許ü要嘗試async選項 - 這將導致TIMED_WAIT狀態,如下所示:

Android - how do I investigate an ANR?

(主線程是確定)。

但是,像這裏討論:

http://groups.google.com/group/android-ndk/browse_thread/thread/84d6a9be21f4e579/b83537161b96da82?q=%22Bitmap+creation+and+composition+in+native+code%22#b83537161b96da82

你的問題,我懷疑是因爲位圖繪畫時間過長lockCanvas()和unlockCanvas()之間 - 也許你會想打破位圖更新成小塊?在同樣的討論中,還提到了使用JNI/NDK進行位圖計算 - 如果計算時間過長,則不應在基於Java的位圖更新方法內完成位圖計算。

推薦閱讀:

http://obviam.net/index.php/the-android-game-loop/

感謝。

+0

謝謝,我會閱讀。 – Danedo 2011-03-15 00:54:14

+1

謝謝。你是一個紳士和學者。 – Danedo 2011-03-31 02:24:36

0

基於日誌,我能想到的唯一的原因可能引發的ANR是:

據我所知,一般Java中的每個線程與2個組件相關聯。一個是程序計數器,另一個是垃圾收集器。所以每個線程都會有一個gc監視器。

在java.lang.Object.wait(本機方法) - 等待< 0x4001d950>(一個java.lang.VMThread)

VMThreads理想地用於處理監控GC的這個方面,幾乎平行。所以我想你的場景是SurfaceViewis試圖獲得一個鎖,但無法執行,因爲VMThread持有鎖,尚未發佈(可能是由於某些主要的GC操作),因此等待vmthread釋放鎖。

您可能想要檢查您的主日誌轉儲,其中包含gc活動記錄,這可能會讓您更好地瞭解爲什麼gc佔用此線程CPU時間,然後應用程序分析可能會有所幫助。 Jus檢查。

相關問題