【问题标题】:Thread.sleep not crashes my app [closed]Thread.sleep 不会使我的应用程序崩溃[关闭]
【发布时间】: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 不会因为您决定调用它而崩溃。

标签: java android multithreading crash


【解决方案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() 或异步执行。您的应用程序将响应您的所有交互。它也不会使您的应用程序崩溃。

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

【讨论】:

  • ANR(应用 N 到 R 响应)是由于在主线程(UI 线程)中处理长时间运行的任务。如果主线程停止超过 5 秒,您将得到 ANR。
【解决方案3】:

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

【讨论】:

    猜你喜欢
    • 2014-01-24
    • 1970-01-01
    • 1970-01-01
    • 2017-04-07
    • 1970-01-01
    • 1970-01-01
    • 2012-11-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多