android应用程序中的停止线程
}android应用程序中的停止线程,android,multithreading,Android,Multithreading,} 我想在手机铃声响起时创建led messenger。但我不能停止眨眼。我不知道它不起作用。Led在通话收入时启动,但在通话下降时不停止。当调用被拒绝时,变量环将更改为“false”,但线程仍在工作通常,您不会强制停止线程,因为这很危险。您设置了一个标志,告诉相关线程在受控环境下退出其线程循环 您的线程循环的外观如下所示: public class CallEvent extends BroadcastReceiver{ public LEDController ledController =
我想在手机铃声响起时创建led messenger。但我不能停止眨眼。我不知道它不起作用。Led在通话收入时启动,但在通话下降时不停止。当调用被拒绝时,变量环将更改为“false”,但线程仍在工作通常,您不会强制停止线程,因为这很危险。您设置了一个标志,告诉相关线程在受控环境下退出其线程循环 您的线程循环的外观如下所示:
public class CallEvent extends BroadcastReceiver{
public LEDController ledController = new LEDController();
public ApplicationSettings applicationSettings = new ApplicationSettings();
public boolean ring = false;
@Override
public void onReceive(Context context, Intent intent){
if(intent.getStringExtra(TelephonyManager.EXTRA_STATE).equals(TelephonyManager.EXTRA_STATE_RINGING)){
ring = true;
blink();
}else if(intent.getStringExtra(TelephonyManager.EXTRA_STATE).equals(TelephonyManager.EXTRA_STATE_IDLE) ||
intent.getStringExtra(TelephonyManager.EXTRA_STATE).equals(TelephonyManager.EXTRA_STATE_OFFHOOK)){
ring = false;
}
}
public void blink(){
Runnable r = new Runnable() {
@Override
public void run() {
while(ring){
ledController.turnOnFlash();
try {
Thread.sleep(applicationSettings.getDelayOn());
} catch (InterruptedException e) {
e.printStackTrace();
}
ledController.turnOffFlash();
try {
Thread.sleep(applicationSettings.getDelayOff());
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
};
Thread blinkThread = new Thread(r);
blinkThread.start();
}
在其他地方设置shouldContinue
变量,并等待线程完成:
void run() {
while (shouldContinue) {
doThreadWorkUnit();
}
}
(所有这些可能都不是正确的Java,因为我不使用Java。请将其视为伪代码,并根据您的实际语言/线程库/等进行修改。)
来源:通常,您不会强制停止线程,因为这很危险。您设置了一个标志,告诉相关线程在受控环境下退出其线程循环 您的线程循环的外观如下所示:
public class CallEvent extends BroadcastReceiver{
public LEDController ledController = new LEDController();
public ApplicationSettings applicationSettings = new ApplicationSettings();
public boolean ring = false;
@Override
public void onReceive(Context context, Intent intent){
if(intent.getStringExtra(TelephonyManager.EXTRA_STATE).equals(TelephonyManager.EXTRA_STATE_RINGING)){
ring = true;
blink();
}else if(intent.getStringExtra(TelephonyManager.EXTRA_STATE).equals(TelephonyManager.EXTRA_STATE_IDLE) ||
intent.getStringExtra(TelephonyManager.EXTRA_STATE).equals(TelephonyManager.EXTRA_STATE_OFFHOOK)){
ring = false;
}
}
public void blink(){
Runnable r = new Runnable() {
@Override
public void run() {
while(ring){
ledController.turnOnFlash();
try {
Thread.sleep(applicationSettings.getDelayOn());
} catch (InterruptedException e) {
e.printStackTrace();
}
ledController.turnOffFlash();
try {
Thread.sleep(applicationSettings.getDelayOff());
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
};
Thread blinkThread = new Thread(r);
blinkThread.start();
}
在其他地方设置shouldContinue
变量,并等待线程完成:
void run() {
while (shouldContinue) {
doThreadWorkUnit();
}
}
(所有这些可能都不是正确的Java,因为我不使用Java。请将其视为伪代码,并根据您的实际语言/线程库/等进行修改。)
来源:您可能不想为此使用单独的线程,因为它会降低手机速度并消耗额外的电池电量。相反,您可以查看这个答案()以了解如何做到这一点。当您不想再闪烁时,您只需设置一个不再次发布任务的标志。为此使用服务。。。broadcastreiver不应该有自己的线程。。。但你可以开始服务。。。然后,您可以发送意图来停止闪烁。是否使用blinkThread.interrupt()@保罗来自哪里?您是否假设每次都是同一个CallEvent Receiver实例?您是否尝试过
public volatile boolean ring=false代码>?您可能不想为此使用单独的线程,因为它会降低手机速度并消耗额外的电池电量。相反,您可以查看这个答案()以了解如何做到这一点。当您不想再闪烁时,您只需设置一个不再次发布任务的标志。为此使用服务。。。broadcastreiver不应该有自己的线程。。。但你可以开始服务。。。然后,您可以发送意图来停止闪烁。是否使用blinkThread.interrupt()@保罗来自哪里?您是否假设每次都是同一个CallEvent Receiver实例?您是否尝试过public volatile boolean ring=false代码>?你没有在OP中看到戒指旗吗?@MarkW没有,他没有。。。他是一个“谷歌人”(类似于代表的农民):他通过谷歌找到答案并粘贴(“原样”,没有任何附加值,但至少他提供了一个到来源的链接)。。。有时关键字是不够的。。。答案很好,但不是针对给定的问题…你没有在OP中看到戒指旗吗?@MarkW没有,他没有。。。他是一个“谷歌人”(类似于代表的农民):他通过谷歌找到答案并粘贴(“原样”,没有任何附加值,但至少他提供了一个到来源的链接)。。。有时关键字是不够的。。。答案很好,但不是针对给定的问题。。。