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 的参考 -

ANR (Force close/Wait) while generating a big enough list Forcing ANR for testing purpose

查看此文档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) 使我的程序崩溃?

按下相同的控件时按下 segue,使我的应用程序崩溃

程序在 Thread.sleep() 和 Timer 期间冻结

为啥我的 unwind segue 会使我的应用程序崩溃?