Android中的ANR和崩溃有什么区别?

时间:2013-11-26 09:48:17

标签: android

我在互联网上搜索了ANR是什么。我也研究了这些参考文献。但我没有得到有关Android崩溃的详细信息。

有人能告诉我ANR(Android无响应)和Android崩溃之间的区别吗?

13 个答案:

答案 0 :(得分:87)

ANR代表 A 应用 N ot R

如果您在UI线程上运行一个需要很长时间(通常约为5秒)的进程,则会发生ANR。在此期间,GUI(图形用户界面)将锁定,这将导致用户按下的任何内容都不会被操作。在大约发生5秒后,如果线程仍未恢复,则会显示ANR对话框,通知用户应用程序没有响应,并且会让用户选择等待,希望应用程序能够最终恢复,或强制关闭应用程序。

崩溃是指应用程序中的异常被抛出但尚未处理。例如,如果您尝试设置EditText组件的文本,但EditText为空且没有try catch语句来捕获应用程序崩溃并将强制关闭的异常。用户不会看到导致崩溃的原因,他们将看到一个对话框,告诉他应用程序意外关闭了力量,并为他们提供发送错误报告的选项。在此示例中,如果您要查看错误报告,您将看到由java.lang.NullPointerException引起的错误。

希望这会有所帮助。

答案 1 :(得分:12)

ANR A 应用 N R 响应)是由于处理long running task in Main Thread( UI线程)。如果主线程停止超过5秒,你会得到ANR。

崩溃归因于exception and error,如Nullpoint,classNotfound,类型转换,解析错误等.ANR也会导致应用程序崩溃。

注意:永远不要在UI线程上运行长时间运行的任务

参考ANR

答案 2 :(得分:8)

ANR和崩溃示例:

这个问题已经有了一个可以接受的答案,但是我添加了两个简单的例子来更好地理解ANR和Crash。

<强> ANR

// this will produce an ANR on your app
int i = 0;
while(true) {
    i++;
}

<强>崩溃:

// this will crash your app : will produce java.lang.ArithmeticException
int value = 5, i = 0;
int result = value / i;

答案 3 :(得分:2)

ANR代表Application Not Responding,这意味着您的应用程序不再在UI线程上注册事件,因为在那里执行了长时间运行的操作

答案 4 :(得分:1)

ANR: It is called when anything your application is doing in the UI thread that 
takes a long time to complete (5 sec approx)

参考:ANR

Crash: It is called when  your Application gets some Error or Exception raised by the DVM

答案 5 :(得分:1)

ANR也由 -

引起
  1. 在5秒内没有响应输入事件(例如按键或屏幕触摸事件)。
  2. BroadcastReceiver尚未在10秒内完成执行。

答案 6 :(得分:1)

ANR代表应用无响应,当长线操作发生在主线程中时,它就会发生......

崩溃是由于异常和错误造成的,如Nullpoint,

答案 7 :(得分:1)

应用无响应(ANR):

ANR将在以下条件中显示:

  • 在5秒内响应输入事件(例如按键或屏幕触摸)

  • 广播接收器尚未在10秒内完成执行。

如何避免ANR?

  • 为长时间运行的操作(如数据库操作,网络操作等)创建不同的工作线程。

加强响应能力: 在Android应用程序中,通常100到200毫秒是用户会觉得应用程序运行缓慢的阈值。以下是我们可以使应用程序更具响应性的提示。

  • 在您进行任何后台工作并且用户正在等待响应时显示进度对话框。

  • 具体来说,对于游戏中的移动进行计算。

  • 如果您的应用程序具有耗时的初始设置,则显示启动画面。

<强>崩溃: 崩溃是未处理的条件进入应用程序,它将强制关闭我们的应用程序。一些崩溃的例子就像Nullpointer异常,非法状态异常等。

答案 8 :(得分:1)

ANR代表应用程序无响应

可能由于许多原因而发生,例如,如果应用程序阻止UI线程上的某些I / O操作,则系统无法处理传入的用户输入事件。或许应用程序花费太多时间构建精心设计的内存结构或计算UI线程中的下一步。

阻止主线程,不会导致崩溃,但会显示一个弹出窗口,让用户在5秒后杀死该应用。

但是对于崩溃,主要原因是人为错误。 大多数情况下,应用程序崩溃是因为人类编码/设计错误

人为错误

缺乏测试

空指针异常

出现OutofMemory

示例:

当程序员引用不存在的对象或变量时,这很常见,基本上会产生空指针错误。

如果连接错误,也可能导致应用崩溃。该应用程序也可能存在内存管理问题。

请参阅我的答案,了解可能导致崩溃的特定于Android的异常类型。

Android Specific Exception

答案 9 :(得分:0)

ANR for ex:如果你正在ui线程中下载大量数据,其他可能性如内存不足等等它会来......可能它会导致android崩溃,我们不能说两者都是一样的跟随其他< / p>

答案 10 :(得分:0)

[ANR和Crash Different] [1] Android应用程序通常完全在单个线程上运行,默认情况下为“UI线程”或 “主线”。这意味着您的应用程序在UI线程中执行的任何操作都需要很长时间才能完成,因为您的应用程序没有给自己处理输入事件或意图广播的机会。

答案 11 :(得分:0)

ANR:基本上是由于主线程上的长时间运行任务。

诊断ANR时需要寻找一些常见的模式:

  1. 应用程序在主线程上执行涉及I / O的慢速操作。
  2. 该应用正在对主线程进行长时间的计算。
  3. 主线程正在对另一个进程执行同步绑定器调用,而其他进程需要很长时间才能返回。
  4. 主线程被阻塞,等待在另一个线程上发生的长时间操作的同步块。
  5. 主线程与另一个线程处于死锁状态,无论是在您的进程中还是通过绑定器调用。主线程不只是等待长时间的操作才能完成,而是陷入僵局。
  6. 以下技巧可以帮助您找出导致ANR的原因。

    <强> CRASH:

    崩溃的原因可能很多。一些原因是显而易见的,比如检查空值或空字符串,但其他原因更为微妙,例如将无效参数传递给API或甚至复杂的多线程交互

答案 12 :(得分:0)

这是开发人员门户网站上的好文章。 它提供了有关ANR的详细信息。 https://developer.android.com/training/articles/perf-anr.html