我在两种情况下都得到了ANR:
throw new NullPointerException("random null pointer");
和
while(true){}
仅在异常部分VM实际关闭(D / AndroidRuntime:关闭VM)。
第二个问题是:如何强制app崩溃而不是ANR并在logcat中获取堆栈跟踪?
更新 改变了标题ANR和Crash之间的区别。
更新 它发生在大约3-4个月前。从那以后,只有找到崩溃的方法就是无处不在地把try catch盒子放到任何地方。
答案 0 :(得分:5)
我遇到同样的问题,当我调试时,我到达代码“throw RuntimeException”但我也有ANR。
我唯一的线索是,当我在我的应用中配置Google Analytics时,它就开始发生了。这是你的情况,@ Alpha?
我没有超越,因为我有点像这样处理它,但有一天我将专门为这个问题进行分析调试。
编辑: 该问题已在Google Play Services 8.4中解决。我们终于可以报告未被捕获的异常! 该应用程序似乎被阻止了几秒钟,但最终抛出异常并报告没有ANR。
答案 1 :(得分:2)
崩溃:应用程序已停止,因为它抛出了未经检查的异常,因此JVM停止。
ANR :您的应用程序停止响应,这意味着UI线程被昂贵或长时间操作阻止。例如,在UI线程上执行while(true){}
。
我认为您无法捕获触发ANR对话框的系统内置机制,因此您可能会抛出RuntimeException并导致应用程序崩溃。我不确定你为什么要这样做,尝试遵循指南here会更好,这样你就可以避免ANR和崩溃。
答案 2 :(得分:0)
App Crash / Force Close
http://www.quora.com/What-causes-Android-apps-to-force-close
如果应用耗尽了太多内存或处理能力,应用就会 被迫关闭(崩溃)。确保不确定的最好方法 碰巧就是编写非常有效的代码而不会使用很多代码 记忆,并不断测试你的应用程序的各种 设备(主要是较旧的设备,因为它们具有较少的RAM和 处理能力)。原因也是例外。
<强> ANR 强>
http://developer.android.com/training/articles/perf-anr.html
答案 3 :(得分:0)
更改默认异常处理程序时遇到此问题。在我的情况下,我在捕获异常时遇到了NullPointerException,这导致了一个导致ANR的循环。
与注释中提到的@Fighter42一样,它可以出现在任何覆盖默认异常行为的库中。
希望这有帮助!
答案 4 :(得分:0)
我现在正在使用Google Play服务8.4并且未捕获的异常不再导致ANR。我已经使用了一段时间,在早期版本中也可以。
现在的结果是,当存在未捕获的异常时,UI不会响应几秒钟,但最终会抛出异常并在Google Analytics中报告。