需要在此反复出现的问题,ANR keyDispatchingTimedOut一些见解 [英] Need some insight on this recurring issue, ANR keyDispatchingTimedOut

查看:1051
本文介绍了需要在此反复出现的问题,ANR keyDispatchingTimedOut一些见解的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有一个应用程序,保持在一个特定的成分越来越ANR,我想不出什么占用的CPU时间。最近我已经得到2种ANR,本地和等待。

  DALVIK主题:
主PRIO = 5 TID = 1的原生
  |组=主SCOUNT = 1 dsCount = 0 S = N的obj = 0x4001d8c0自我= 0xccc8
  | sysTid = 10569漂亮= 0 sched的= 0/0 CGRP =默认的手柄= -1345017816
  | schedstat =(9041503981 6690216078 17225)
  在android.view.Surface.lockCanvasNative(本机方法)
  在android.view.Surface.lockCanvas(Surface.java:314)
  在android.view.SurfaceView $ 3.internalLockCanvas(SurfaceView.java:773)
  在android.view.SurfaceView $ 3.lockCanvas(SurfaceView.java:756)
  在com.dane.hud.Surfaceview $ DrawThread.run(Surfaceview.java:776)
  在com.dane.hud.Surfaceview.onTouchEvent(Surfaceview.java:322)
  在android.view.View.dispatchTouchEvent(View.java:3766)
  在android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:936)
  在android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:936)
  在android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:936)
  在android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:936)
  在android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:936)
  在com.android.internal.policy.impl.PhoneWindow$DecorView.superDispatchTouchEvent(PhoneWindow.java:1671)
  在com.android.internal.policy.impl.PhoneWindow.superDispatchTouchEvent(PhoneWindow.java:1107)
  在android.app.Activity.dispatchTouchEvent(Activity.java:2086)
  在com.android.internal.policy.impl.PhoneWindow $ DecorView.dispatchTouchEvent(PhoneWindow.java:1655)
  在android.view.ViewRoot.handleMessage(ViewRoot.java:1785)
  在android.os.Handler.dispatchMessage(Handler.java:99)
  在android.os.Looper.loop(Looper.java:123)
  在android.app.ActivityThread.main(ActivityThread.java:4627)
  在java.lang.reflect.Method.invokeNative(本机方法)
  在java.lang.reflect.Method.invoke(Method.java:521)
  在com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run(ZygoteInit.java:858)
  在com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)
  在dalvik.system.NativeStart.main(本机方法)

捆扎线#3PRIO = 5 TID = 9 NATIVE
  |组=主SCOUNT = 1 dsCount = 0 S = N的obj = 0x44821de0自我= 0x2b9b78
  | sysTid = 10585漂亮= 0 sched的= 0/0 CGRP =默认的手柄= 2857768
  | schedstat =(726806597 708740243 2395)
  在dalvik.system.NativeStart.run(本机方法)

捆扎线2PRIO = 5 TID = 6 NATIVE
  |组=主SCOUNT = 1 dsCount = 0 S = N的obj = 0x4476c5e8自我= 0x13cbf8
  | sysTid = 10574漂亮= 0 sched的= 0/0 CGRP =默认的手柄= 1213280
  | schedstat =(767669649 687500005 2512)
  在dalvik.system.NativeStart.run(本机方法)

捆扎线#1PRIO = 5 TID = 5 NATIVE
  |组=主SCOUNT = 1 dsCount = 0 S = N的obj = 0x4476b310自我= 0x126f90
  | sysTid = 10573漂亮= 0 sched的= 0/0 CGRP =默认的手柄= 1208144
  | schedstat =(749938913 622802748 2497)
  在dalvik.system.NativeStart.run(本机方法)

编译器守护PRIO = 5 TID = 4 VMWAIT
  |组=系统SCOUNT = 1 dsCount = 0 S = N的obj = 0x447652a0自我= 0x125b80
  | sysTid = 10572漂亮= 0 sched的= 0/0 CGRP =默认的手柄= 1251720
  | schedstat =(999145549 669586193 5169)
  在dalvik.system.NativeStart.run(本机方法)

信号守望者守护PRIO = 5 TID = 3 RUNNABLE
  |组=系统SCOUNT = 0 dsCount = 0 S = N的obj = 0x447651e8自我= 0x121988
  | sysTid = 10571漂亮= 0 sched的= 0/0 CGRP =默认的手柄= 1251656
  | schedstat =(16204836 16693113 8)
  在dalvik.system.NativeStart.run(本机方法)

HeapWorker守护PRIO = 5 TID = 2 VMWAIT
  |组=系统SCOUNT = 1 dsCount = 0 S = N的obj = 0x431a9650自我= 0x1317c0
  | sysTid = 10570漂亮= 0 sched的= 0/0 CGRP =默认的手柄= 1172520
  | schedstat =(28203003083 34572570617 10984)
  在dalvik.system.NativeStart.run(本机方法)
 

  DALVIK主题:
主PRIO = 5 TID = 1 WAIT
  |组=主SCOUNT = 1 dsCount = 0 S = N的obj = 0x4001d8c0自我= 0xccc8
  | sysTid = 2428漂亮= 0 sched的= 0/0 CGRP =默认的手柄= -1345017816
  | schedstat =(5054412632 4232574644 11781)
  在java.lang.Object.wait(本机方法)
   - 等待< 0x4001d950> (一java.lang.VMThread)
  在java.lang.Thread.parkFor(Thread.java:1535)
  在java.lang.LangAccessImpl.parkFor(LangAccessImpl.java:48)
  在sun.misc.Unsafe.park(Unsafe.java:317)
  在java.util.concurrent.locks.LockSupport.park(LockSupport.java:131)
  在java.util.concurrent.locks.AbstractQueuedSynchronizer.parkAndCheckInterrupt(AbstractQueuedSynchronizer.java:790)
  在java.util.concurrent.locks.AbstractQueuedSynchronizer.acquireQueued(AbstractQueuedSynchronizer.java:823)
  在java.util.concurrent.locks.AbstractQueuedSynchronizer.acquire(AbstractQueuedSynchronizer.java:1153)
  在java.util.concurrent.locks.ReentrantLock中的$ NonfairSync.lock(ReentrantLock.java:185)
  在java.util.concurrent.locks.ReentrantLock.lock(ReentrantLock.java:261)
  在android.view.SurfaceView $ 3.internalLockCanvas(SurfaceView.java:764)
  在android.view.SurfaceView $ 3.lockCanvas(SurfaceView.java:756)
  在com.dane.hud.Surfaceview $ DrawThread.run(Surfaceview.java:776)
  在com.dane.hud.Surfaceview.onTouchEvent(Surfaceview.java:319)
  在android.view.View.dispatchTouchEvent(View.java:3766)
  在android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:936)
  在android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:936)
  在android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:936)
  在android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:936)
  在android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:936)
  在com.android.internal.policy.impl.PhoneWindow$DecorView.superDispatchTouchEvent(PhoneWindow.java:1671)
  在com.android.internal.policy.impl.PhoneWindow.superDispatchTouchEvent(PhoneWindow.java:1107)
  在android.app.Activity.dispatchTouchEvent(Activity.java:2086)
  在com.android.internal.policy.impl.PhoneWindow $ DecorView.dispatchTouchEvent(PhoneWindow.java:1655)
  在android.view.ViewRoot.handleMessage(ViewRoot.java:1785)
  在android.os.Handler.dispatchMessage(Handler.java:99)
  在android.os.Looper.loop(Looper.java:123)
  在android.app.ActivityThread.main(ActivityThread.java:4627)
  在java.lang.reflect.Method.invokeNative(本机方法)
  在java.lang.reflect.Method.invoke(Method.java:521)
  在com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run(ZygoteInit.java:858)
  在com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)
  在dalvik.system.NativeStart.main(本机方法)

线程448PRIO = 5 TID = 16 WAIT
  |组=主SCOUNT = 1 dsCount = 0 S = N的obj = 0x447e4b40自我= 0x2e5960
  | sysTid = 2892漂亮= 0 sched的= 0/0 CGRP =默认的手柄= 3037856
  | schedstat =(495635974 519531260 463)
  在java.lang.Object.wait(本机方法)
   - 等待< 0x447eeb10> (一java.lang.VMThread)
  在java.lang.Thread.parkFor(Thread.java:1535)
  在java.lang.LangAccessImpl.parkFor(LangAccessImpl.java:48)
  在sun.misc.Unsafe.park(Unsafe.java:317)
  在java.util.concurrent.locks.LockSupport.park(LockSupport.java:131)
  在java.util.concurrent.locks.AbstractQueuedSynchronizer.parkAndCheckInterrupt(AbstractQueuedSynchronizer.java:790)
  在java.util.concurrent.locks.AbstractQueuedSynchronizer.acquireQueued(AbstractQueuedSynchronizer.java:823)
  在java.util.concurrent.locks.AbstractQueuedSynchronizer.acquire(AbstractQueuedSynchronizer.java:1153)
  在java.util.concurrent.locks.ReentrantLock中的$ NonfairSync.lock(ReentrantLock.java:185)
  在java.util.concurrent.locks.ReentrantLock.lock(ReentrantLock.java:261)
  在android.view.SurfaceView $ 3.internalLockCanvas(SurfaceView.java:764)
  在android.view.SurfaceView $ 3.lockCanvas(SurfaceView.java:756)
  在com.dane.hud.Surfaceview $ DrawThread.run(Surfaceview.java:776)
  在com.dane.hud.HUD.updateWithNewLocation(HUD.java:639)
  在com.dane.hud.HUD.access $ 3(HUD.java:618)
  在com.dane.hud.HUD $ updateEverythingFromGPS.run(HUD.java:573)

线程447PRIO = 5 TID = 15 WAIT
  |组=主SCOUNT = 1 dsCount = 0 S = N的obj = 0x447fb5f0自我= 0x2bd690
  | sysTid = 2890漂亮= 0 sched的= 0/0 CGRP =默认的手柄= 2873296
  | schedstat =(636688219 727813733 545)
  在java.lang.Object.wait(本机方法)
   - 等待< 0x447fb780> (一java.lang.VMThread)
  在java.lang.Thread.parkFor(Thread.java:1535)
  在java.lang.LangAccessImpl.parkFor(LangAccessImpl.java:48)
  在sun.misc.Unsafe.park(Unsafe.java:317)
  在java.util.concurrent.locks.LockSupport.park(LockSupport.java:131)
  在java.util.concurrent.locks.AbstractQueuedSynchronizer.parkAndCheckInterrupt(AbstractQueuedSynchronizer.java:790)
  在java.util.concurrent.locks.AbstractQueuedSynchronizer.acquireQueued(AbstractQueuedSynchronizer.java:823)
  在java.util.concurrent.locks.AbstractQueuedSynchronizer.acquire(AbstractQueuedSynchronizer.java:1153)
  在java.util.concurrent.locks.ReentrantLock中的$ NonfairSync.lock(ReentrantLock.java:185)
  在java.util.concurrent.locks.ReentrantLock.lock(ReentrantLock.java:261)
  在android.view.SurfaceView $ 3.internalLockCanvas(SurfaceView.java:764)
  在android.view.SurfaceView $ 3.lockCanvas(SurfaceView.java:756)
  在com.dane.hud.Surfaceview $ DrawThread.run(Surfaceview.java:776)
  在com.dane.hud.HUD.updateWithNewLocation(HUD.java:639)
  在com.dane.hud.HUD.access $ 3(HUD.java:618)
  在com.dane.hud.HUD $ updateEverythingFromGPS.run(HUD.java:573)

线程446PRIO = 5 TID = 14 WAIT
  |组=主SCOUNT = 1 dsCount = 0 S = N的obj = 0x44823a68自我=​​ 0x2ccac0
  | sysTid = 2889漂亮= 0 sched的= 0/0 CGRP =默认的手柄= 2874496
  | schedstat =(774780280 777496325 693)
  在java.lang.Object.wait(本机方法)
   - 等待< 0x44786fe8> (一java.lang.VMThread)
  在java.lang.Thread.parkFor(Thread.java:1535)
  在java.lang.LangAccessImpl.parkFor(LangAccessImpl.java:48)
  在sun.misc.Unsafe.park(Unsafe.java:317)
  在java.util.concurrent.locks.LockSupport.park(LockSupport.java:131)
  在java.util.concurrent.locks.AbstractQueuedSynchronizer.parkAndCheckInterrupt(AbstractQueuedSynchronizer.java:790)
  在java.util.concurrent.locks.AbstractQueuedSynchronizer.acquireQueued(AbstractQueuedSynchronizer.java:823)
  在java.util.concurrent.locks.AbstractQueuedSynchronizer.acquire(AbstractQueuedSynchronizer.java:1153)
  在java.util.concurrent.locks.ReentrantLock中的$ NonfairSync.lock(ReentrantLock.java:185)
  在java.util.concurrent.locks.ReentrantLock.lock(ReentrantLock.java:261)
  在android.view.SurfaceView $ 3.internalLockCanvas(SurfaceView.java:764)
  在android.view.SurfaceView $ 3.lockCanvas(SurfaceView.java:756)
  在com.dane.hud.Surfaceview $ DrawThread.run(Surfaceview.java:776)
  在com.dane.hud.HUD.updateWithNewLocation(HUD.java:639)
  在com.dane.hud.HUD.access $ 3(HUD.java:618)
  在com.dane.hud.HUD $ updateEverythingFromGPS.run(HUD.java:573)

线程445PRIO = 5 TID = 13 WAIT
  |组=主SCOUNT = 1 dsCount = 0 S = N的obj = 0x447f2288自我= 0x2e2a80
  | sysTid = 2888漂亮= 0 sched的= 0/0 CGRP =默认的手柄= 3026032
  | schedstat =(831634516 815490735 696)
  在java.lang.Object.wait(本机方法)
   - 等待< 0x447f2418> (一java.lang.VMThread)
  在java.lang.Thread.parkFor(Thread.java:1535)
  在java.lang.LangAccessImpl.parkFor(LangAccessImpl.java:48)
  在sun.misc.Unsafe.park(Unsafe.java:317)
  在java.util.concurrent.locks.LockSupport.park(LockSupport.java:131)
  在java.util.concurrent.locks.AbstractQueuedSynchronizer.parkAndCheckInterrupt(AbstractQueuedSynchronizer.java:790)
  在java.util.concurrent.locks.AbstractQueuedSynchronizer.acquireQueued(AbstractQueuedSynchronizer.java:823)
  在java.util.concurrent.locks.AbstractQueuedSynchronizer.acquire(AbstractQueuedSynchronizer.java:1153)
  在java.util.concurrent.locks.ReentrantLock中的$ NonfairSync.lock(ReentrantLock.java:185)
  在java.util.concurrent.locks.ReentrantLock.lock(ReentrantLock.java:261)
  在android.view.SurfaceView $ 3.internalLockCanvas(SurfaceView.java:764)
  在android.view.SurfaceView $ 3.lockCanvas(SurfaceView.java:756)
  在com.dane.hud.Surfaceview $ DrawThread.run(Surfaceview.java:776)
  在com.dane.hud.HUD.updateWithNewLocation(HUD.java:639)
  在com.dane.hud.HUD.access $ 3(HUD.java:618)
  在com.dane.hud.HUD $ updateEverythingFromGPS.run(HUD.java:573)

线程444PRIO = 5 TID = 12 WAIT
  |组=主SCOUNT = 1 dsCount = 0 S = N的obj = 0x447c97c0自我= 0x2c4910
  | sysTid = 2887漂亮= 0 sched的= 0/0 CGRP =默认的手柄= 2780792
  | schedstat =(1249114988 1195007328 1038)
  在java.lang.Object.wait(本机方法)
   - 等待< 0x447cd918> (一java.lang.VMThread)
  在java.lang.Thread.parkFor(Thread.java:1535)
  在java.lang.LangAccessImpl.parkFor(LangAccessImpl.java:48)
  在sun.misc.Unsafe.park(Unsafe.java:317)
  在java.util.concurrent.locks.LockSupport.park(LockSupport.java:131)
  在java.util.concurrent.locks.AbstractQueuedSynchronizer.parkAndCheckInterrupt(AbstractQueuedSynchronizer.java:790)
  在java.util.concurrent.locks.AbstractQueuedSynchronizer.acquireQueued(AbstractQueuedSynchronizer.java:823)
  在java.util.concurrent.locks.AbstractQueuedSynchronizer.acquire(AbstractQueuedSynchronizer.java:1153)
  在java.util.concurrent.locks.ReentrantLock中的$ NonfairSync.lock(ReentrantLock.java:185)
  在java.util.concurrent.locks.ReentrantLock.lock(ReentrantLock.java:261)
  在android.view.SurfaceView $ 3.internalLockCanvas(SurfaceView.java:764)
  在android.view.SurfaceView $ 3.lockCanvas(SurfaceView.java:756)
  在com.dane.hud.Surfaceview $ DrawThread.run(Surfaceview.java:776)
  在com.dane.hud.HUD.updateWithNewLocation(HUD.java:639)
  在com.dane.hud.HUD.access $ 3(HUD.java:618)
  在com.dane.hud.HUD $ updateEverythingFromGPS.run(HUD.java:573)

线程443PRIO = 5 TID = 11 VMWAIT JIT
  |组=主SCOUNT = 1 dsCount = 0 S = Y OBJ = 0x4480cd28自我= 0x2d27b0
  | sysTid = 2886漂亮= 0 sched的= 0/0 CGRP =默认的手柄= 2959600
  | schedstat =(1636657703 1482391360 1374)
  在java.util.concurrent.locks.AbstractQueuedSynchronizer.addWaiter(AbstractQueuedSynchronizer.java:~562)
  在java.util.concurrent.locks.AbstractQueuedSynchronizer.acquire(AbstractQueuedSynchronizer.java:1153)
  在java.util.concurrent.locks.ReentrantLock中的$ NonfairSync.lock(ReentrantLock.java:185)
  在java.util.concurrent.locks.ReentrantLock.lock(ReentrantLock.java:261)
  在android.view.Surfa ...
 

任何想法?我提出操作新主题,也许我不是要求加入();在他们身上。

感谢您的帮助。

解决方案

在这里:

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

ANR是当主线程被阻塞的东西,只要操作始终是建议做的子线程:

报价:

  

因此​​,运行在任何方法   主线程应该做的一些工作   越好。特别是,活动   应该做的尽可能少设置   在关键的生命周期方法,如   的onCreate()和onResume()。潜在   长时间运行的操作,如   网络或数据库操作,或   计算昂贵的计算   如调整位图应该是   在一个子线程完成(或者在的情况下   通过一个数据库的操作,   异步请求)。但是,此   并不意味着你的主线程   在等待应该阻止   子线程来完成 - 也不应该   你叫Thread.wait()或   Thread.sleep()方法。相反,阻断   在等待一个子线程到   完成后,你的主线程应该   为子线程提供一个处理程序   后回完成后。   设计你的应用程序以这种方式   将让你的主线程保持   响应输入,从而避免ANR   所引起的5第二输入对话框   事件超时。这些相同的做法   应遵循任何其他   中显示的UI,因为它们是线程   也受到了同样的超时。

我的理解是不容易的,但是从上面的建议是,用户界面​​应在主线程中功不可没。

在另一方面,你主线程处于等待状态,这意味着非异步操作被使用。也许ü要尝试async选项 - 这将导致TIMED_WAIT状态,如下所示:

Android的 - 我怎么调查的ANR

(主线程就可以了)。

但在这里讨论的一样:

<一个href="http://groups.google.com/group/android-ndk/browse_thread/thread/84d6a9be21f4e579/b83537161b96da82?q=%22Bitmap+creation+and+composition+in+native+$c$c%22#b83537161b96da82" rel="nofollow">http://groups.google.com/group/android-ndk/browse_thread/thread/84d6a9be21f4e579/b83537161b96da82?q=%22Bitmap+creation+and+composition+in+native+$c$c%22#b83537161b96da82

你的问题,我怀疑是因为位图绘画时间过长lockCanvas()和unlockCanvas()之间 - 也许你可能要突破该位图更新成小块?而在相同的讨论也提到,在使用JNI / NDK做位图的计算 - 这应该不是基于Java的位图的更新方法中完成 - 如果时间太长,做计算。

推荐阅读:

http://obviam.net/index.php/the-android - 游戏环/

感谢。

I have an app that keeps getting ANR in one specific component, and I cannot figure out what is hogging the cpu time. Lately I've been getting two kinds of ANR, a native and a wait.

 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)

and

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...

Any ideas? I have moved operations to new threads, and maybe I am not calling join(); on them.

Thanks for any help.

解决方案

In here:

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

ANR is when the main thread is blocking on something, so long operation is always advised to do it in the child thread:

TO QUOTE:

Therefore any method that runs in the main thread should do as little work as possible. In particular, Activities should do as little as possible to set up in key life-cycle methods such as onCreate() and onResume(). Potentially long running operations such as network or database operations, or computationally expensive calculations such as resizing bitmaps should be done in a child thread (or in the case of databases operations, via an asynchronous request). However, this does not mean that your main thread should block while waiting for the child thread to complete — nor should you call Thread.wait() or Thread.sleep(). Instead of blocking while waiting for a child thread to complete, your main thread should provide a Handler for child threads to post back to upon completion. Designing your application in this way will allow your main thread to remain responsive to input and thus avoid ANR dialogs caused by the 5 second input event timeout. These same practices should be followed for any other threads that display UI, as they are also subject to the same timeouts.

I understand it is not easy, but the recommendation from above is that UI should be done not in the main thread.

On the other hand, you main thread is in "WAIT" state, meaning non-async operation is used. Perhaps u want to try the async option - which should result in TIMED_WAIT state, as in the following:

Android - how do I investigate an ANR?

(whose main thread is ok).

But like discussed here:

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

your problem I suspect is because bitmap painting takes too long between lockCanvas() and unlockCanvas() - perhaps you might want to break the bitmap update into smaller pieces? And within the same discussion is also mentioned use of JNI/NDK to do the bitmap calculation - which should not be done inside the Java-based bitmap update method - if it takes too long to do the calculation.

Recommended read:

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

Thanks.

这篇关于需要在此反复出现的问题,ANR keyDispatchingTimedOut一些见解的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆