我一直在与我的一项服务中发生的ANR斗争一段时间了。它很难重现,并且UI似乎在它发生之前就具有完整的功能,100%的时间从来没有任何明显的滞后或冻结。我的服务有一个TimerTask和一些运行的AsyncTask,就是这样。
当您使用2.2中的Android Market报告时,我得到的堆栈跟踪很难阅读,似乎没有直接引用我的任何代码,只是来自SDK中的类。任何人都可以看看堆栈跟踪,看看你是否可以告诉发生了什么。
打印输出是如此之大我选择将其发布到pastebin,我希望这不违反规则。 http://pastebin.com/KHUD0UHW
这也是Logcat日志 http://pastebin.com/V5xSey36
答案 0 :(得分:5)
这可能不是你的应用程序错误。无论“当前”应用是什么,ANR都会显示出来。但是,如果系统上的另一个应用程序真正取出你的CPU并迫使你的应用程序挨饿,你的应用程序将获得ANR,因为它具有用户的关注点。如果是这种情况,你无能为力。测试此功能的最佳方法可能是观察或强制系统进行同步。同步通常在手机上非常沉重,并且可能会在功能较弱的手机上造成严重延迟。
测试手机速度较慢的另一种方法是安装市场上的大型应用。一旦下载后进入“安装”阶段,在您的应用程序中执行一些稍微密集的操作。如果安装阶段花费的时间超过5秒左右,那么它可以让您的应用获得ANR。这是因为安装应用程序时IO速度不佳。 IO阻止其他应用程序获得CPU时间。 Android认为这意味着你正在窃取它。