通过在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!
答案 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()。不起作用。 只需启动任何需要很长时间才能执行的功能。就像在主要活动等上加载一个巨大的图像文件一样