3 回答

TA贡献1828条经验 获得超6个赞
当在“主”线程中发生一些长操作时,会发生ANR。这是事件循环线程,如果它很忙,Android无法处理应用程序中的任何其他GUI事件,从而抛出ANR对话框。
现在,在您发布的跟踪中,主线程似乎做得很好,没有问题。它在MessageQueue中空闲,等待另一条消息进来。在你的情况下,ANR可能是一个更长的操作,而不是永久阻塞线程的东西,所以事件线程在操作完成后恢复,你的跟踪经历了在ANR之后。
如果ANR是永久性块(例如,死锁获取某些锁),则检测ANR发生的位置很容易,但如果它只是暂时的延迟则更难。首先,查看代码并查找可用的点和长时间运行的操作。示例可以包括在事件线程内使用套接字,锁,线程休眠和其他阻塞操作。你应该确保这些都发生在不同的线程中。如果没有任何问题,请使用DDMS并启用线程视图。这会显示应用程序中的所有线程与您拥有的跟踪类似。重现ANR,同时刷新主线程。这应该向你展示ANR时正在发生的事情

TA贡献1884条经验 获得超4个赞
考虑使用ANR-Watchdog库以高细节精确跟踪和捕获ANR堆栈跟踪。然后,您可以将它们发送到崩溃报告库。我建议setReportMainThreadOnly()
在这种情况下使用。您可以让应用程序抛出冻结点的非致命异常,或者在ANR发生时强制退出应用程序。
请注意,发送到Google Play开发者控制台的标准ANR报告通常不够准确,无法确定问题所在。这就是需要第三方库的原因。
- 3 回答
- 0 关注
- 556 浏览
添加回答
举报