gpt4 book ai didi

android - 需要了解这个反复出现的问题,ANR keyDispatchingTimedOut

转载 作者:行者123 更新时间:2023-11-29 15:32:10 25 4
gpt4 key购买 nike

我有一个应用程序在一个特定组件中不断出现 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 是当主线程阻塞在某些东西上时,所以总是建议在子线程中执行长时间操作:

引用:

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.

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

另一方面,您的主线程处于“WAIT”状态,这意味着使用了非异步操作。也许您想尝试异步选项 - 这应该会导致 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/

谢谢。

关于android - 需要了解这个反复出现的问题,ANR keyDispatchingTimedOut,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5290148/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com