Thread.sleep 不会使我的应用程序崩溃[关闭]
Posted
技术标签:
【中文标题】Thread.sleep 不会使我的应用程序崩溃[关闭]【英文标题】:Thread.sleep not crashes my app [closed] 【发布时间】:2017-08-21 00:06:23 【问题描述】:通过在 UI 线程上调用 Thread.sleep
,我希望我的 android 应用程序崩溃,但事实并非如此。
我尝试通过使用runOnUiThread
在 UI 线程上显式运行它,但结果是一样的,应用程序冻结但没有崩溃。
在 UI 线程上使用 Thread.sleep(6000)
时,我应该预期应用会崩溃吗?
public class CrashActivity extends Activity
@Override
protected void onResume()
super.onResume();
runOnUiThread(new Runnable()
@Override
public void run()
try
Thread.sleep(50000);
catch (InterruptedException e)
e.printStackTrace();
);
我正在尝试模拟 ANR!
【问题讨论】:
我不认为它会崩溃,但它应该会冻结 UI。 为什么你的应用会崩溃?你的问题很模糊,不包含任何代码 您真的想知道为什么您的应用不会崩溃吗?答案是因为它不应该。没有错误代码。 我原以为 Android 操作系统会因为冻结 UI 线程而停止我的应用程序。 AFAIK Thread.sleep 不会因为您决定调用它而崩溃。 【参考方案1】:Thread.sleep(miliseconds)
“使当前执行的线程休眠(暂时停止执行)指定的毫秒数”
意思是,
如果您在 MainThread 即 UI 线程上调用 Thread.sleep()
,它将冻结 UI 并导致线程在给定的时间内停止执行;因此,如果没有其他线程需要运行,CPU 将进入空闲模式。我认为它不会创建 ANR。
如果某些大型操作要在 UI 线程上操作,则会发生 ANR 情况。考虑一下这个计算示例。
如果您单击 Button 并执行类似的代码 -
public void onClick(View v)
....
int a = 1;
while(true)
a++;
这将导致ANR
。
这里有一些关于 ANR 的参考 -
查看此文档How to avoid ANR
【讨论】:
我正在尝试模拟 ANR,但调用Thread.sleep
似乎不会发生。
对 ANR 做过一些研究。编辑了关于我发现的答案。【参考方案2】:
正如已经解释的那样,Thread.sleep() 本身不会使您的应用程序崩溃。它只会让你的线程进入睡眠模式,持续几毫秒,这是你作为参数传递的。
场景 1:
您正在主线程中执行 Thread.sleep。 UI 响应停止或冻结。这意味着用户无法与应用程序进行任何交互。
如果您的超时时间太长,比如 30 分钟,并且您一直尝试与应用程序交互,那么操作系统会给您一个强制退出程序的机会。
场景 2:
您正在另一个线程中执行 Thread.sleep() 或异步执行。您的应用程序将响应您的所有交互。它也不会使您的应用程序崩溃。
对于后台任务,您可以使用
TimerTask Handler AsyncTask【讨论】:
ANR(应用 N 到 R 响应)是由于在主线程(UI 线程)中处理长时间运行的任务。如果主线程停止超过 5 秒,您将得到 ANR。 【参考方案3】:如果你想刺激 ANR,那么不要调用 Thread.sleep()。不起作用。 只需启动任何需要很长时间才能执行的功能。比如在主要活动上加载一个巨大的图像文件等。
【讨论】:
以上是关于Thread.sleep 不会使我的应用程序崩溃[关闭]的主要内容,如果未能解决你的问题,请参考以下文章
为啥大型本地数组会使我的程序崩溃,而全局数组却不会? [复制]
Log.d(String, String) 使我的程序崩溃?