2013-03-26 2 views
0

버튼 클릭 다음 함수를 호출 중입니다.스레드에서 수면 문제

private void badButtonHandler() { 
    Camera.Parameters params = mCamera.getParameters(); 
    params.setColorEffect(Camera.Parameters.EFFECT_NEGATIVE); 
    mCamera.setParameters(params); 
    if(thread != null){ 
     thread = null; 
    } 
    thread = new Thread() 
    { 
     @Override 
     public void run() { 
      try { 
       while(true) { 
        sleep(5000); 
        Camera.Parameters params = mCamera.getParameters(); 
        params.setColorEffect(Camera.Parameters.EFFECT_NONE); 
        mCamera.setParameters(params); 
       } 
      } catch (InterruptedException e) { 
       e.printStackTrace(); 
      } 
     } 
    }; 

    thread.start(); 
} 

이 기능은 버튼 클릭 5 초 후 카메라의 색상 효과를 변경하기위한 것입니다. 관련 버튼을 처음으로 누르면 예상대로 작동합니다. 그러나이 함수에 대한 추가 호출은 예상대로 작동하지 않습니다. 즉, 두 번째로 2 초 동안 기다린 후 클릭 한 번에 값이 낮아집니다.

+0

대신 사용하는 I 생각 스레드가 u는 안드로이드에서 버튼을 처음 –

+0

을 클릭하면 후 지속적으로 실행되고 있기 때문에 스레드를 제어하는 ​​플래그를 사용하십시오 ://developer.android.com/reference/android/os/Handler.html#postDelayed(java.lang.Runnable, long) –

+0

첫 번째 실행 후 중지 할 수 있습니까 ?? 다시 실행하십시오 .. –

답변

0

아니요은 정확한 타이머로 sleep()에 의존해야합니다. 모든 스레드가 스레드 스케줄러의 자비에 있다는 단순한 사실 때문에 지정된 시간에 자동으로 깨어나 현재 활성 스레드가되지는 않습니다. 의심의 여지없이 주어진 JVM에 따라 OS마다 다를 것입니다.

저는 항상 이러한 유형의 시나리오에 대한 사용자 지정 타이머 함수를 사용했습니다. 따라서, 예를 들어 :

myTimer(System.nanoTime()); 

public static void myTimer(long startTime) { 
    while (startTime + 5000000000 > System.nanoTime()) { //Wait for 5 seconds 
     try { 
      Thread.sleep(50); //Sleep at ~50 millisecond intervals 
     } 
     catch (InterruptedException e) { 
      e.printStackTrace(); 
     } 
    } 
} 

당신이 (Thread.sleep를하기 때문에, 당신의 예에서했던 것처럼 당신은 완전히 새로운 스레드를 만들 필요가 없습니다)은 잠을 현재 스레드를 넣어 것입니다. 또한 while (true) 루프를 사용하는 것은 프로그래밍 실력이 부족합니다.

nanoTime()을 사용하면 Java에서 사용할 수있는 가장 정밀한 시스템 타이머이므로 바람직합니다.

sleep() 함수의 신뢰할 수없는 추가 정보는 this documentation을 참조하십시오.

+0

Sleep은 Android에서 ['SystemClock.sleep (long)']을 사용하여 단순화 할 수 있습니다 (http : // developer.android.com/reference/android/os/SystemClock.html#sleep(long)), InterruptedException을 throw하지 않습니다. –

+0

@JustinMuller 명시 적 이유가없는 한 스레드를 인터럽트 할 수있는 기능을 포기하지 않습니다. 그렇게해라. 특히 타이머가 만료되기 전에 최종 사용자가 해당 장치에서 절전 버튼을 누를 때 발생하는 상황을 제어하려고합니다. –

-1

의 더 나은 postDelayed 방법은 http 처리기를 사용하는 댓글이

Thread timer = new Thread(new Runnable() { 

     @Override 
     public void run() { 
      // TODO Auto-generated method stub 
      try { 
       Thread.sleep(3000); 
      } catch (InterruptedException e) { 
       // TODO Auto-generated catch block 
       e.printStackTrace(); 
      }finally{ 
       //Your desired work 
      } 
     } 
    }); 
    timer.start(); 
+0

finally 절을 추가해도 sleep()을 절대로 타이머로 사용해서는 안된다는 사실을 설명하지 않습니다. –