2014-01-07 1 views
0

다음과 같은 스트로브 라이트를 생성했습니다. 버튼을 누르면 시작되고 다시 누르면 중지됩니다. 지금 그것이 열려 있고 클릭 할 때, 닫히지 만, 다시 클릭 할 때 아무 일도 일어나지 않습니다!스트로브 라이트는 정상적으로 작동하지만 클릭시 잘 작동하지 않습니다

클릭 리스너가 없으면 앱 시작시 시작되지만 훌륭하게 작동하지만 중지 할 방법이 없습니다.

public class Small extends Activity { 

    private MMAdView adViewFromXml; 
    RefreshHandler handler; 
    ImageButton knob; 
    int n=100000; 
    Camera mCamera; 
    Parameters params; 
    int delay = 400; // in ms 
    public boolean on; 
    public boolean works; 
    Thread logotimer; 
    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.act_small_button); 

     knob = (ImageButton) findViewById(R.id.pic); 
     strobe(); 

     knob.setOnClickListener(new View.OnClickListener() { 
       @Override 
       public void onClick(View iv) { 
        if(works == true){ 
         logotimer.interrupt(); 
        }else if(works != true) 
        { 
         strobe(); 
        } 
       } 
      }); 

       }); 

    } 

    /** Turn the devices FlashLight on */ 
    public void turnOn() { 
     if (mCamera != null) { 
     // Turn on LED 
     params = mCamera.getParameters(); 
     params.setFlashMode(Parameters.FLASH_MODE_TORCH); 
     mCamera.setParameters(params); 
     mCamera.startPreview(); 
     on = true; 
     } 

    } 

    /** Turn the devices FlashLight off */ 
    public void turnOff() { 
     // Turn off flashlight 
     if (mCamera != null) { 
     params = mCamera.getParameters(); 
     params.setFlashMode(Parameters.FLASH_MODE_OFF); 
     mCamera.setParameters(params); 
     mCamera.stopPreview(); 


     } 
     on = false; 
    } 

    /** Toggle the flashlight on/off status */ 
    /*public void toggleFlashLight() { 
     if (!on) { // Off, turn it on 
     turnOn(); 
     } else { // On, turn it off 
     turnOff(); 
     } 
}*/ 
    private void strobe(){ 
     Thread logotimer = new Thread() { 
     public void run() { 
      try { 
      // Switch on the cam for app's life 
      if (mCamera == null) { 
       // Turn on Cam 
       try{ 
       mCamera = Camera.open(); 
       } catch (RuntimeException e) { 
       Log.e("Camera Error. Failed to Open. Error: ", e.getMessage()); 
       } 
       try { 
       mCamera.setPreviewDisplay(null); 
       } catch (IOException e) { 
       e.printStackTrace(); 
       } 
       mCamera.startPreview(); 
      } 
      int logotimer = 0; 
      while(!interrupted() && logotimer <5000) { 
       logotimer = logotimer ++; 
       works = true; 

       if (!on) { // Off, turn it on 
        turnOn(); 
        } else if(on == true) { // On, turn it off 
        turnOff(); 
        } 
       sleep(delay); 
      } 
      if (mCamera == null) { 
       mCamera.stopPreview(); 
       mCamera.release(); 
       mCamera = null; 
      } 
      } catch (InterruptedException e){ 

      e.printStackTrace(); 
      } 
     } 
     };logotimer.start(); 
    } 
} 

로그 캣 :

01-08 15:17:33.807: W/System.err(28814): java.lang.InterruptedException 
01-08 15:17:33.808: W/System.err(28814): at java.lang.VMThread.sleep(Native Method) 
01-08 15:17:33.808: W/System.err(28814): at java.lang.Thread.sleep(Thread.java:1013) 
01-08 15:17:33.808: W/System.err(28814): at java.lang.Thread.sleep(Thread.java:995) 
01-08 15:17:33.809: W/System.err(28814): at com.light.oid.Small$4.run(Small.java:163) 
+0

, 당신은 카메라를 출시하지만, 스트로브 루프를 중지하지 않습니다. – njzk2

+0

onclick 메서드에서 루프를 중지하고 카메라를 스레드로 해제해야합니다. – njzk2

+0

@ njzk2 더 구체적 일 수 있으시겠습니까? –

답변

0

추가 스트로브() onclick을 내부 전화 :

@Override 
public void onClick(View iv) { 
    if(works) { 
     logotimer.interrupt(); 

    } else { 
     //mCamera = Camera.open(); //remove this 
     //and add strobe() 
     strobe(); 
    } 
} 

을 또한, 전역 스레드 logotimer을 가지고 있지만, 당신의 스트로브() 메소드에서, 당신이 만드는 같은 이름을 가진 로컬 변수입니다. 따라서 버튼을 클릭하면 logotimer가 null이됩니다. 왜냐하면 로컬 그림자는 전역이기 때문입니다.

스트로브에서

() 변경 :

private void strobe(){ 
    Thread logotimer = new Thread() { 
     public void run() { 

에 : 당신은 손잡이를 클릭하면

private void strobe(){ 
    logotimer = new Thread() { 
     public void run() { 
+0

불행히도 작동하지 않습니다. –

+0

logcat'01-07 21 : 24 : 50.477 : 전자/웹 콘솔 (30326) : Uncaught ReferenceError : MMJS가 null로 정의되지 않았습니다. : 1 01-07 21 : 24 : 52.763 : W/System.err (30326) : java.lang.RuntimeException : 릴리스 이후에 호출 된 메서드 01-07 21 : 24 : 52.764 : W/System.err (30326)) : \t android.hardware.Camera.native_getParameters (기본 메소드) 01-07 21 : 24 : 52.765 : W/System.err (30326) : \t android.hardware.Camera.getParameters (Camera.java:1589) 01-07 21 : 24 : 52.765 : W/System.err (30326) : \t com.light.oid.Small.turnOn (Small.java:100) 01-07 21 : 24 : 52.765 : 승/시스템 .err (30326) : \t at com.light.oid. Small $ 4.run (Small.java:154) ' –

+0

전체 클래스 코드로 질문을 업데이트하십시오. – Melquiades

관련 문제