2016-08-20 3 views
3

SOS 모드로 손전등 응용 프로그램 만들기. 3 개의 버튼 (On, Off 및 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; 
      } 
     } 

을 (SOS 모드를 끄고 나던) 내가 읽어 보시기 이후 FlashthreadturnOffFlash 방법은 여기

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; 
      } 
     } 
    } 

사용 Interrupt 메서드는 실제로 "인터럽트"하지 않거나 스레드를 강제 종료하지 않습니다. Thread.Interrupt(); 대신 Off 단추를 누르면 SOS 모드가 중지됩니다. stop()destroy()을 시도했지만 모두 앱이 다운되었습니다.

+1

같은 인기있는 라이브러리 중 하나에 사용됩니까? 대신에'Handler'를 사용하는 것이 잘못된 이유는 무엇입니까? –

+0

'처리기'를 사용하여 SOS 모드를 시도합니다. 하지만 일반적으로 인터럽트가 실제로 의도 한 작업을 수행하지 않는 상황에서 내가해야 할 일은 무엇입니까? –

+0

또한 가능한 경우 'Handler'를 사용하여 구현하는 코드 샘플을 보내 주시겠습니까? 고맙습니다! –

답변

1

은 당신이 사용해야하는 것은 의견 제안으로 Handler이지만,이 시스템을 고수 할 경우, 정지 스레드를 알려줄 수있는 플래그를 사용 : 당신은 Thread#interrupt()를 사용하려면

boolean shouldStop = false; 

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

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

이 문제를 해결하여 주셔서 감사합니다. 다른 코드에 더하기 –

+0

그냥 2 차 질문입니다. 이 코드는 일시 중지 된 스레드를 다시 시작할 수 없으므로 SOS 모드를 한 번만 실행합니까? –

+0

그래, 다시 시작할 수 있도록 수정할 수는 있지만. 그러나 내가 할 것은이 클래스가 무엇이든간에 새 인스턴스를 인스턴스화하고 시작하는 것입니다. 이해가 되니? –

1

을 Exception이 던져 지도록 강요하고 싶다면.

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

관련 문제