这里有点奇怪:我的活动有一半时间被冻结,我从系统中获得了ARN。
前一段时间我在AndEngine + PhysicsBox2d扩展中编写了一个简单的游戏,没有引起任何ANR问题。 我花了最近几天重构代码,引入了几个类来处理启动配置和移动代码以提高内聚力。 理想情况下,没有实现行为改变。 但是现在,如果我打开应用程序并正常关闭它,第二次打开它,应用程序冻结并获得力量关闭超时。 以下是日志的输出:
09-03 19:41:40.416: ERROR/ActivityManager(138): ANR in mp.andreabarbadoro.mama (mp.andreabarbadoro.mama/.DaisyGameActivity)
09-03 19:41:40.416: ERROR/ActivityManager(138): Reason: keyDispatchingTimedOut
09-03 19:41:40.416: ERROR/ActivityManager(138): Load: 2.77 / 2.62 / 2.35
09-03 19:41:40.416: ERROR/ActivityManager(138): CPU usage from 13439ms to 0ms ago with 99% awake:
09-03 19:41:40.416: ERROR/ActivityManager(138): 3.2% 116/akmd: 0.9% user + 2.3% kernel
09-03 19:41:40.416: ERROR/ActivityManager(138): 2% 1679/mp.andreabarbadoro.mama: 2% user + 0% kernel / faults: 3 minor
09-03 19:41:40.416: ERROR/ActivityManager(138): 1.6% 138/system_server: 1% user + 0.5% kernel / faults: 3 minor 1 major
09-03 19:41:40.416: ERROR/ActivityManager(138): 0.5% 228/com.android.launcher: 0.5% user + 0% kernel / faults: 57 minor
09-03 19:41:40.416: ERROR/ActivityManager(138): 0.6% 1697/kworker/0:1: 0% user + 0.6% kernel
09-03 19:41:40.416: ERROR/ActivityManager(138): 0% 67/yaffs-bg-1: 0% user + 0% kernel
09-03 19:41:40.416: ERROR/ActivityManager(138): 0% 1699/logcat: 0% user + 0% kernel
09-03 19:41:40.416: ERROR/ActivityManager(138): 1.4% TOTAL: 1.2% user + 0.2% kernel
09-03 19:41:40.416: ERROR/ActivityManager(138): CPU usage from 1542ms to 2104ms later:
09-03 19:41:40.416: ERROR/ActivityManager(138): 10% 138/system_server: 3.5% user + 7.1% kernel
09-03 19:41:40.416: ERROR/ActivityManager(138): 3.5% 173/InputDispatcher: 3.5% user + 0% kernel
09-03 19:41:40.416: ERROR/ActivityManager(138): 1.7% 149/SensorService: 1.7% user + 0% kernel
09-03 19:41:40.416: ERROR/ActivityManager(138): 3.5% 116/akmd: 0% user + 3.5% kernel
09-03 19:41:40.416: ERROR/ActivityManager(138): 3.5% 1694/akmd: 0% user + 3.5% kernel
09-03 19:41:40.416: ERROR/ActivityManager(138): 3.5% 1679/mp.andreabarbadoro.mama: 3.5% user + 0% kernel
09-03 19:41:40.416: ERROR/ActivityManager(138): 3.5% 1688/er$SensorThread: 1.7% user + 1.7% kernel
09-03 19:41:40.416: ERROR/ActivityManager(138): 0.9% 1697/kworker/0:1: 0% user + 0.9% kernel
09-03 19:41:40.416: ERROR/ActivityManager(138): 10% TOTAL: 7.1% user + 3.5% kernel
09-03 19:41:50.756: WARN/ActivityManager(138): Force finishing activity mp.andreabarbadoro.mama/.DaisyGameActivity
那么,任何想法从哪里开始寻找这个bug?
修改 在查看Activity.onDestroy方法的断点的调试窗口后,我可以看到活动死后android.hardware.sensormanager $ SensorThread似乎仍然活着。 这是正常行为吗?
答案 0 :(得分:1)
您可以查看/data/anr/traces.txt并参考主线程的堆栈跟踪。 (假设此文件未被新ANR覆盖)。
答案 1 :(得分:0)
你在onCreate方法上做什么?看来你正在做一些应该在不同的线程中处理的重物。
如果没有看到代码,就很难指出问题......所以我现在最好的建议是为繁重的任务启动一个线程。 考虑在线程完成之前显示启动画面/进度对话框(您可以使用AsyncTask)
答案 2 :(得分:0)
记住ANR的含义:您在一段时间内阻止主/ UI线程(5s,请参阅What Triggers ANR?),以便无法正确处理输入事件。
所以你可能在这个帖子里做了一些繁重的工作,可能是从onResume()
或onRestart()
执行的。开始寻找这些昂贵的操作,并确保在单独的线程中执行它们(例如通过AsyncTasks
)。如果您不确定应用中的昂贵操作,请考虑使用traceview
进行测量。请参阅Android开发者博客上的this post以获得精彩的介绍。