RuntimeException 在 android 中导致 ANR 而不是崩溃

RuntimeException causes ANR instead of crash in android

我两次都收到 ANR:

throw new NullPointerException("random null pointer");

while(true){}

只有异常部分VM才真正关闭(D/AndroidRuntime:正在关闭VM)。

第二个问题是:如何强制应用崩溃而不是 ANR 并在 logcat 中获取堆栈跟踪?

更新 更改标题从 ANR 和崩溃之间的区别。

更新 它仅发生在大约 3-4 个月前。从那时起,找到崩溃的唯一方法就是毫无理由地将 try catch boxes 放在各处。

应用Crash/Force关闭

http://www.quora.com/What-causes-Android-apps-to-force-close

If the app uses up too much memory or processing power, the app will be forced to close (crash). The best way to make sure that doesn't happen is to write very efficient code that doesn't use a lot of memory, and to constantly test your application on a variety of devices (primarily the older devices because they have less RAM and processing power).And exceptions too behind the reason.

ANR

http://developer.android.com/training/articles/perf-anr.html

Crash : 应用程序已停止,因为它抛出了未经检查的异常,因此 JVM 停止。

ANR :您的应用程序停止响应,这意味着 UI 线程被昂贵或长时间的操作阻塞。例如,在 UI 线程上执行 while(true){}

我认为您没有办法捕获触发 ANR 对话框的系统内置机制,因此您可能会抛出 RuntimeException 并导致应用程序崩溃。我也不确定你为什么要这样做,最好尝试并遵循指南 here 这样你就可以完全避免 ANR 和崩溃。

我遇到了同样的问题,在调试时我遇到了代码 "throw RuntimeException",但我也遇到了 ANR。

我唯一的线索是当我在我的应用程序中配置 Google 分析时它开始发生。这是你的情况吗,@Alpha?

我没有超越,因为我有点像这样处理它,但有一天我会专门针对这个问题进行分析调试。

编辑: 此问题已在 Google Play Services 8.4 中解决。我们终于可以报告未捕获的异常了! 该应用程序似乎被阻止了几秒钟,但最终抛出异常并报告没有 ANR。

我在更改默认异常处理程序时遇到了这个问题。在我的例子中,我在捕获异常时遇到了一个 NullPointerException,这导致了一个循环,从而导致了 ANR。

就像评论中提到的@Fighter42,它可以出现在任何覆盖默认异常行为的库中。

希望对您有所帮助!

我现在正在使用 Google Play Services 8.4 和未捕获的异常不再导致 ANR。我已经使用了一段时间,在早期版本中可能也可以。

现在的结果是,当有未捕获的异常时,UI几秒钟没有响应,但最终抛出异常并报告在Google分析中。