gpt4 book ai didi

java - 无法停止线程

转载 作者:行者123 更新时间:2023-12-02 03:08:51 24 4
gpt4 key购买 nike

我有这两种方法来创建和停止线程。然而,即使在调用第一个方法之后,线程仍然保持运行。 (我正在创建该类的一个对象并从另一个类调用它们)。

private Thread thread;

public void stopAlarm() {
Log.i(LOG_TAG, "stopAlarm called");
sendAlarm = false;
if (!thread.equals(null)) {
try {
thread.join();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}


public void triggerAlarm() {
Runnable alarmTest = new Runnable() {
@Override
public void run() {
while (sendAlarm) {
Log.i(LOG_TAG, String.valueOf(sendAlarm));
}
}
};
thread = new Thread(Test);
thread.start();
}

当调用stopAlarm时,线程始终为null,尽管它是在调用triggerAlarm之后调用的(线程正在运行)。

最佳答案

您的问题是由线程范围引起的。当您创建一个在作用域中具有相同变量的线程但您无法从外部更改这些变量时,就会创建线程作用域。在 Android 中管理可运行对象的最佳实践是使用 Handler

Handler handler = new Handler();
Runnable alarmTest = new Runnable() {
@Override
public void run() {
Log.i(LOG_TAG, String.valueOf(sendAlarm));
handler.post(alarmTest, 5000); //wait 5 sec and run again
//you can stop from outside
}
};

定义之后,为了启动可运行的:

handler.post(alarmTest,0); //wait 0 ms and run

为了停止可运行:

handler.removeCallbacks(alarmTest);

编辑:带循环的等待语句

编辑:完整的解决方案

Handler handler = new Handler();
Runnable alarmTest = new Runnable() {
@Override
public void run() {
Log.i(LOG_TAG, String.valueOf(sendAlarm));
handler.post(alarmTest, 5000); //wait 5 sec and run again
//you can stop from outside
}
};

public void stopAlarm() {
Log.i(LOG_TAG, "stopAlarm called");
handler.removeCallbacks(alarmTest);
}


public void triggerAlarm() {
handler.post(alarmTest,0); //wait 0 ms and run
}

关于java - 无法停止线程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41346820/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com