考虑这个例子:
Thread thread = new Thread(new Runnable() {
public void run() {
// Sleep for 5000ms
// Show toast message
}
});
现在我将在MainActivity中单击按钮时启动此线程,然后我会在按下后退按钮时退出活动,但是在下面的代码中实现onBackPressed的覆盖方法:
If(thread != null)
thread.interupt();
finish();
几秒钟后会显示吐司信息,为什么会这样?
答案 0 :(得分:1)
中断,清除线程的interrupt
状态,并导致InterruptedException
被抛出。因此,如果您的线程处于休眠状态,并且在它处于睡眠状态时,您将调用interrupt
,它将被唤醒,执行流程将从catch块后面的指令继续。假设你有一些非常简单的东西:
public void run() {
try {
Thread.sleep(500);
} catch (InterruptedException e) {
e.printStackThreace();
}
runOnUiThread(TOAST);
}
或
public void run() {
while(true) {
try {
Thread.sleep(500);
} catch (InterruptedException e) {
e.printStackThreace();
}
runOnUiThread(TOAST);
}
}
即使你调用了interrupt(),也会显示Toast
答案 1 :(得分:0)
虽然blackbelt已经解释了发生这种情况的原因,但以下是解决问题的方法。
中断线程的最佳方法是使用if-boolean-break方法。 因此,如果我要重新编写代码,那将是以下几行
onBackPressed:
isBackPressed = true;
在线程的run方法中:
Thread thread = new Thread(new Runnable() {
public void run() {
// Sleep for 5000ms
if(!isBackPressed){
// Show toast message
}
}
});