我在互联网上搜索了什么是ANR。 我也研究了这些参考资料。 但是我没有关于Android崩溃的详细信息。
有人可以告诉我ANR(Android无法响应)与Android崩溃之间的区别吗?
ANR代表应用程序无响应。
如果您在UI线程上运行一个过程很长时间(通常大约5秒钟),则会发生ANR。在此期间,GUI(图形用户界面)将锁定,这将导致用户按动的任何操作都不起作用。大约5秒钟后,如果线程仍未恢复,则会显示一个ANR对话框,通知用户该应用程序没有响应,并将为用户提供等待的选择,希望该应用程序能够最终恢复,或强制关闭应用程序。
崩溃是指在应用内引发了未处理的异常。例如,如果您尝试设置EditText组件的文本,但是EditText为null,并且没有try catch语句来捕获应用程序崩溃并被强制关闭的异常。用户将不会看到导致崩溃的原因,将向他们显示一个对话框,告知该应用程序意外关闭,并将为他们提供发送错误报告的选项。在此示例中,如果您要查看错误报告,则会看到由java.lang.NullPointerException引起的错误。
希望这可以帮助。
如果您通过JNI运行C ++代码并在其中遇到错误,则应用程序进程将完全崩溃,而用户不会看到对话框。 至少过去。
ANR(Application Not Responding)是由于处理long running task in Main Thread(UI线程)引起的。如果主线程停止了5秒钟以上,您将得到ANR。
崩溃是由于exception and error之类的Nullpoint,classNotfound,typecast,parse错误等引起的。ANR也导致应用程序崩溃。
注意:切勿在UI线程上运行长时间运行的任务
参考ANR
为什么会发生崩溃?
@ user3035740现在检查ans
是否可以在我的设备中找到与ANR相关的信息?
如果您遇到崩溃,可以始终找到它logcat trace
永远不要在UI线程中运行长时间运行的任务...
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;
应用程序无响应(ANR):
ANR将在以下情况下显示:
在5秒内对输入事件的响应(例如按键或均匀触摸屏幕)。
广播接收器尚未在10秒内执行完毕。
如何避免ANR?
为长时间运行的操作(例如数据库操作,网络操作等)创建另一个工作线程。
增强响应能力:
在android应用中,通常100到200毫秒是阈值,超过此阈值,用户会觉得该应用运行缓慢。以下是一些技巧,通过这些技巧我们可以显示应用程序的响应速度。
每当您进行任何后台工作且用户正在等待响应时,都将显示"显示进度"对话框。
特别是对于游戏,请计算辅助线程中的移动。
如果您的应用程序具有耗时的初始设置,则显示初始屏幕。
崩溃:
崩溃是应用程序无法处理的情况,它将强制关闭我们的应用程序。崩溃的一些示例如Nullpointer异常,非法状态异常等。
ANR代表应用程序无响应,这意味着您的应用程序不再在UI线程上注册事件,因为在那里执行了长时间运行的操作
ANR代表应用程序无响应。
发生这种情况的原因有很多,例如应用程序是否阻止了UI线程上的某些I / O操作,因此系统无法处理传入的用户输入事件。也许应用程序花费太多时间来构建精致的内存结构或计算UI线程中的下一步。
阻塞主线程不会导致崩溃,但是会显示一个弹出窗口,让用户在5秒钟后将其杀死。
但是对于崩溃,主要原因是人为错误。
应用程序崩溃的大部分时间是由于人为的编码/设计错误
人为错误
缺乏测试
空指针异常
记不清
范例:
当程序员引用一个不存在的对象或变量时,这很常见,基本上会产生一个空指针错误。
如果连接不良,这也可能会使您的应用崩溃。该应用程序还可能存在内存管理问题。
请查看我的答案以了解可能导致崩溃的android特定异常的类型。
Android特定异常
ANR代表"应用程序无响应",当长时间在主线程中进行操作时会发生……
崩溃是由于异常和错误(例如Nullpoint,
ANR也由以下原因引起:
在5秒钟内没有响应输入事件(例如按键或屏幕触摸事件)。
BroadcastReceiver在10秒内尚未完成执行。
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
ANR:基本上是由于主线程上的任务长时间运行。
诊断ANR时,需要寻找一些常见的模式:
该应用程序正在执行涉及主线程上I / O的慢速操作。
该应用程序正在主线程上进行长时间的计算。
主线程正在对另一个进程进行同步联编程序调用,而另一个进程要花很长时间才能返回。
主线程被阻塞,等待另一个线程上正在进行的长时间操作的同步块。
主线程与另一个线程处于死锁状态,无论是在您的进程中还是通过绑定程序调用。主线程不仅等待长时间的操作完成,而且处于死锁状态。
以下技术可以帮助您找出导致ANR的原因是哪些。
崩溃:
崩溃的原因可能很多。一些原因很明显,例如检查一个空值或空字符串,但另一些原因则更微妙,例如将无效参数传递给API甚至复杂的多线程交互
[ANR和崩溃有所不同] [1]
Android应用程序通常默认情况下完全在单个线程上运行,即" UI线程"或
"主线程"。这意味着您的应用程序在UI线程中需要很长时间才能完成的所有操作都可能触发ANR对话框,因为您的应用程序没有给自己机会来处理输入事件或意图广播。
ANR for ex:如果您正在ui线程中下载大量数据,则会出现其他一些可能性,例如内存不足等。它可能会导致android崩溃,我们不能说两者都是相同的
因此崩溃不同于ANR。对吗?
是的,ANR不会在所有情况下都崩溃。
在哪里可以找到ANR相关信息?
developer.android.com/training/articles/perf-anr.html