0

这里有些奇怪:我的 Activity 有一半时间被冻结,我从系统中获得了一个 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

那么,知道从哪里开始寻找这个错误吗?

编辑: 在调试窗口中查看 Activity.onDestroy 方法的断点后,我可以看到活动结束后 android.hardware.sensormanager$SensorThread 似乎还活着。这是正常的行为吗?

4

3 回答 3

1

您可以查看 /data/anr/traces.txt 并参考主线程的堆栈跟踪。(假设这个文件没有被新的 ANR 覆盖)。

于 2011-09-03T18:33:38.693 回答
0

你在 onCreate 方法上做什么?似乎您正在做一些应该在不同线程中处理的繁重工作。

如果没有看到代码,就很难指出问题所在......所以我现在最好的建议是为繁重的任务启动一个线程。考虑在线程完成之前显示启动屏幕/进度对话框(您可以为此使用 AsyncTask)

于 2011-09-03T18:32:52.017 回答
0

请记住 ANR 的含义:您将主/UI 线程阻塞了一段时间(5 秒,请参阅What Triggers ANR?),因此无法正确处理输入事件。

所以你可能在这个线程中做了一些繁重的工作,可能从 fromonResume()或执行onRestart()。开始寻找这些昂贵的操作并确保在单独的线程中执行它们(例如 via AsyncTasks)。如果您不确定应用程序中的昂贵操作是什么,请考虑使用traceview. 请参阅android 开发者博客上的这篇文章以获得很好的介绍。

于 2011-09-03T18:39:13.017 回答