2011-11-28 12 views
0

我正在嘗試爲手電筒應用程序寫一個新功能。我很確定我需要一個新的線程來做到這一點。不過,我是線程新手,根本不知道該怎麼做。我想要做的是改變一個SeekBar,我希望頻閃得到更快/更慢。如果是0或1恢復到恆亮。Android中的主題。幫幫我?

這是錯誤的,但這就是我所擁有的。每當我將它正確閃光燈在搜索欄,但你不能讓它停止..

在的onCreate():

mSeekBar.setOnSeekBarChangeListener(new OnSeekBarChangeListener(){ 
     public void onProgressChanged(SeekBar seekBar, int progress, boolean fromTouch) { 
     final int myInt = progress; 
     new Thread (new Runnable() { 
      public void run() { 
      if (myInt>1) 
       strobeLight(myInt); 
      else {} 
       // Stop Strobe 
      } }).start(); 
     } 
     public void onStartTrackingTouch(SeekBar seekBar) {} 
     public void onStopTrackingTouch(SeekBar seekBar) {}   
    }); 

strobeLight()方法:

public void strobeLight(int myInt){ 
    do { 
    if (myInt>1){ 
      if (strobe){ 
       processOffClick(); 
       try { Thread.sleep(300/myInt); } 
        catch (InterruptedException e) {} 
       strobe=false; 
       strobeActivated=true;} 
      else{ 
       processOnClick(); 
       try { Thread.sleep(300/myInt); } 
        catch (InterruptedException e) {}      
       strobe=true; } 
     } 
    else{ 
     processOnClick(); 
     strobe=false; 
     Thread.currentThread().interrupt(); 
     strobeActivated=false;} 

    } while (strobeActivated); 
} 

回答

3

我不確定的需要在每次進程更改時創建一個新線程,更好的方法可能是創建一個可更改整數值的最終可運行的程序:

onProgressChange:

public void onProgressChanged(SeekBar seekBar, int progress, boolean fromTouch) { 
     toRun.interval = progress; 
    } 

可運行的實現:我的一些方法創造了新的名字

class StrobeRunnable implements Runnable { 
     volatile boolean running; 
     volatile int interval = 0; 
     private boolean lightIsOn = false; 

     @Override 
     public void run() { 
      while(running){ 
       if (interval > 1){ 
        Thread.sleep(300/interval); 
        lightIsOn = !lightIsOn; 
        switchLight(lightIsOn); 
       } 
       else{ 
        Thread.sleep(600/interval); 
        if(!lightIsOn){ 
         lightIsOn = true; 
         switchLight(lightIsOn); 
        } 
       } 
      } 
     } 
    }; 

注意, switchLight(布爾isLightOn)是什麼,我相信你的processXClick以前那樣,即切換光或的。 和間隔過去被稱爲myInt。

啓動一個線程我更喜歡使用執行人:

StrobeRunnable toRun = new StrobeRunnable(); 
    Executor exec = Executors.newSingleThreadExecutor(); 
    exec.execute(toRun); 

要完全停止運行線程,設置toRun.running爲false,這將停止正在運行的循環。

我沒有測試過這個,但它應該工作。它也取決於你的processClick方法的外觀。

+0

我得到一個錯誤,即toRun.interval無法解析爲某個類型,並且當我將其設置爲運行爲false時,它會導致相同的錯誤 – comead

+1

這是因爲runnable-class通常不包含這些變量,創建這些變量的正確方法是創建一個自定義的可運行實現。我會改變我的例子來證明這一點。 – Jave

+0

好的謝謝!我已經開始工作了,但這與我所做的相似。謝謝! – comead