2013-03-26 104 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

使用標誌,因爲主題是當u點擊按鈕第一次 – 2013-03-26 05:08:34

+0

Android中後連續運行來控制線程我想,而不是使用線程它能夠更好地使用處理器與postDelayed方法HTTP:/ /developer.android.com/reference/android/os/Handler.html#postDelayed(java.lang.Runnable,long) – 2013-03-26 05:09:41

+0

運行第一次後可以停止嗎?並再次運行.. – 2013-03-26 05:09:45

回答

0

你應該不是是依靠睡眠()作爲一個準確的計時器。它不會在指定的時間自動喚醒併成爲當前活動的線程,因爲所有線程都受線程調度程序的支配。毫無疑問,根據給定的JVM,從操作系統到操作系統會有所不同。

我一直依靠這些類型場景的自定義計時器功能。因此,舉例來說:

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中最精確的系統計時器。 ()函數的不可靠性的更多信息,請參閱this documentation

+0

睡眠可以通過使用['SystemClock.sleep(long)'](http://不會拋出'InterruptedException' – 2013-03-26 07:14:12

+0

@JustinMuller我永遠不會放棄中斷線程的能力,除非我有明確的理由這樣做。特別是當我想要控制最終用戶在設備上按下睡眠按鈕時會發生什麼情況* n *秒在定時器到期之前。 – 2013-03-26 07:31:49

-1

試試這個

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()永遠不能用作定時器的事實。 – 2013-03-26 07:03:31