线程中断替代?

时间:2016-08-20 15:14:13

标签: java android multithreading

使用SOS模式构建手电筒应用程序。有3个按钮(开,关和SOS)。应用程序在正常的开启和关闭模式下工作,但在SOS模式下不工作。(SOS模式不关闭)

//this method gets called when Off button is pressed
    private void turnOffFlash() {
            if (FlashOn) {
                if (myCamera == null || myParameters == null) {
                    return;
                }
                myParameters = myCamera.getParameters();
                myParameters.setFlashMode(Parameters.FLASH_MODE_OFF);
                myCamera.setParameters(myParameters);
                myCamera.stopPreview();
                try {
                    if (SOSon)
                        Flashthread.interrupt();
                    SOSon = false;
                } catch (Exception ex) {
                    throw ex;
                }
                FlashOn = false;
                number_of_press=0;
            }
        }

此处使用Flashthread

void onSOSPress() {
        if (number_of_press == 1) {
            try {
                SOSon = true;
                if (!Flashthread.isInterrupted()) {
                    if (SOSon) {
                        Flashthread = new Thread(new Runnable() {
                            @Override
                            public void run() {
                                for (int i = 0; i < System.currentTimeMillis(); i++) {
                                    if (FlashOn) {
                                        myParameters.setFlashMode(Parameters.FLASH_MODE_OFF);
                                        myCamera.setParameters(myParameters);
                                        FlashOn = false;
                                    } else {
                                        TurnOnFlash();
                                    }
                                    try {
                                        Thread.sleep(1000);
                                    } catch (InterruptedException e) {
                                        e.printStackTrace();
                                    }

                                }
                            }
                        });
                        Flashthread.start();
                    }
                } else
                    Flashthread.resume();
            } catch (Exception ex) {
                throw ex;
            }
        }
    }

turnOffFlash方法中,由于我读到中断方法并没有真正“中断”/终止线程,我可以使用什么来代替Thread.Interrupt();以便按下Off }按钮停止SOS模式? 我尝试了stop()destroy(),但两者都崩溃了。

2 个答案:

答案 0 :(得分:1)

您应该使用的是评论中建议的Handler,但如果您想坚持使用此系统,请使用标志告诉您的线程停止:

boolean shouldStop = false;

...
while (!shouldStop){
  if(FlashOn){
    ...//do SOS stuff
  }
}

...
public void endSOS(){
  shouldStop = true;
}

答案 1 :(得分:1)

如果您想强行抛出异常,您想使用Thread#interrupt()

boolean isClose = false;

while(!isClose){
  try {
      // Your code here
  } catch (InterruptedException e) {
     if(isClose){
        break;
     }
  }
}

public void killThread(){
  isClose = true;
  interrupt();
}

实施代码。

 MyCustomThread t = new MyCustomThread(....);

 // Assuming that the thread is already running
 t.killThread();

此方法通常用于Volley等热门库中。