Thread.sleep不会崩溃我的应用程序

时间:2017-03-28 04:35:42

标签: java android multithreading crash

通过在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!

3 个答案:

答案 0 :(得分:0)

Thread.sleep(miliseconds) "导致当前正在执行的线程休眠(暂时停止执行)指定的毫秒数"

手段,

如果你在MainThread即UI线程上调用Thread.sleep(),它将冻结UI并导致线程在给定的时间内明确停止执行;因此,如果不需要运行其他线程,CPU将进入空闲模式。我认为它不会创造ANR。

如果某个大型操作要在UI线程上运行,则会发生ANR情况。考虑这个计算的例子..

如果您点击按钮并执行类似 -

的代码
public void onClick(View v) {
    ....
    int a = 1;
    while(true) {
       a++;
    }
}

这将导致ANR
以下是关于ANR的一些参考 -

查看此文档How to avoid ANR

答案 1 :(得分:0)

正如已经解释过的,Thread.sleep()不会让你的应用程序崩溃。它只会将您的线程停留在休眠模式中,持续数毫秒,您将其作为参数传递。

场景1

您正在主线程中执行Thread.sleep。 UI响应被停止或冻结。这意味着用户无法与应用程序进行任何交互。

如果您的超时时间太长,让我们说30分钟,并且您继续尝试与应用程序进行交互,操作系统将为您提供强制退出程序的机会。

场景2

您正在另一个线程中执行Thread.sleep()或执行异步操作。您的应用程序将响应您的所有互动。它也不会使您的应用程序崩溃。

对于后台任务,您可以使用

答案 2 :(得分:0)

如果你想刺激ANR,那么不要调用Thread.sleep()。不起作用。 只需启动任何需要很长时间才能执行的功能。就像在主要活动等上加载一个巨大的图像文件一样