需要对此经常性问题ANR keyDispatchingTimedOut有所了解

我有一个应用程序可以让ANR保持在一个特定的组件中,而我无法弄清楚CPU时间的问题。 最近我得到了两种ANR,一种土着和一种等待。

 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(); 在他们。

谢谢你的帮助。


在这里:

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

ANR是当主线程阻塞某个东西时,总是建议在子线程中执行长操作:

去引用:

因此,在主线程中运行的任何方法都应该尽可能少地工作。 特别是,活动应尽可能少地设置关键的生命周期方法,如onCreate()和onResume()。 可能长时间运行的操作(如网络或数据库操作)或计算量大的计算(如调整位图大小)应在子线程中完成(或者在数据库操作的情况下,通过异步请求)。 但是,这并不意味着您的主线程应该在等待子线程完成时阻塞 - 也不应该调用Thread.wait()或Thread.sleep()。 在等待子线程完成时,您的主线程应该为子线程提供一个处理程序,以便在完成后发回。 以这种方式设计您的应用程序将允许您的主线程保持对输入的响应,从而避免5秒输入事件超时导致的ANR对话。 显示UI的任何其他线程都应遵循这些相同的做法,因为它们也受到相同的超时限制。

我明白这并不容易,但是上面的建议是UI不应该在主线程中完成。

另一方面,您的主线程处于“WAIT”状态,这意味着使用非异步操作。 也许你想尝试异步选项 - 这应该导致TIMED_WAIT状态,如下所示:

Android - 如何调查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/

谢谢。


根据日志,我能想到的唯一原因可能会触发ANR:

据我所知,通常在Java中,每个线程都与2个组件相关联。 一个是程序计数器,另一个是垃圾收集器。 所以每个线程都会有一个gc监视器。

在java.lang.Object.wait(Native Method) - 等待<0x4001d950>(一个java.lang.VMThread)

VMThreads理想地用于几乎平行地处理监控gc的这一方面。 所以我想你的场景是SurfaceViewis试图获得一个锁,但无法执行,因为VMThread持有锁,尚未发布(可能是由于某些主要的GC操作),因此等待vmthread释放锁。

您可能需要检查您的主日志转储,其中包含gc活动记录,这可能会让您更好地了解为什么gc占用此线程CPU时间,然后应用程序分析可能会有所帮助。 Jus检查。

链接地址: http://www.djcxy.com/p/61973.html

上一篇: Need some insight on this recurring issue, ANR keyDispatchingTimedOut

下一篇: different sets of options