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没有,他没有。。。他是一个“谷歌人”(类似于代表的农民):他通过谷歌找到答案并粘贴(“原样”,没有任何附加值,但至少他提供了一个到来源的链接)。。。有时关键字是不够的。。。答案很好,但不是针对给定的问题。。。