2012-12-28 23 views
0

當我按下這個按鈕:我不知道如何從循環中走出

case R.id.btlento: 
    Timer timers = new Timer(); 
    timers.scheduleAtFixedRate(new TimerTask() { 

    @Override 
    public void run() { 
     // TODO Auto-generated method stub 
     cameraOn(); 
    },deloy1,poriod1); 
     Timer timers2 = new Timer(); 
     timers2.scheduleAtFixedRate(new TimerTask() { 

     @Override 
     public void run() { 
      // TODO Auto-generated method stub 
      cameraOff(); 
     } 
    },deloy,poriod); 

的方法cameraOn和cameraOff是:

private void cameraOff() { 
    // TODO Auto-generated method stub 
    parameters.setFlashMode(Parameters.FLASH_MODE_OFF); 
    camera.setParameters(parameters); 
    camera.release(); 
    camera = null; 
} 

private void cameraOn() { 
    // TODO Auto-generated method stub 
    camera = Camera.open(); 
    parameters = camera.getParameters(); 
    parameters.setFlashMode(Parameters.FLASH_MODE_TORCH); 
    camera.setParameters(parameters); 
} 

和變量是:

int deloy = 2000; 
int poriod = 2000; 
int deloy1 = 1000; 
int poriod1 = 2000; 

這一切都是爲了讓相機閃爍閃爍,但我不知道如何打破循環,因爲永不停止。

如何停止循環?

+1

看起來像你永遠不會關閉計時器? – Jake1164

+1

爲什麼不使用'cancel()'來停止計時器? –

+0

是的,它的確如此,但它從開頭再次開始 – user1918363

回答

0

使用標誌,

// member variables 

private boolean cameraIsFlashing = false; 
private Timer onTimer; 
private Timer offTimer; 

// constructor & other stuff 

// button click method 
case R.id.btlento: 
    toggleCameraFlash(); 
    break; 

private void toggleCameraFlash(){ 
    if(cameraIsFlashing){ 
     stopFlashing(); 
    } else { 
     startFlashing(); 
    } 
} 

private void startFlashing(){ 
    cameraIsFlashing = true; 
    // Start your timers 
    onTimer = new Timer(); 
    onTimer.scheduleAtFixedRate(new TimerTask() { 

    @Override 
    public void run() { 
     cameraOn(); 
    },deloy1,poriod1); 
} 

private void stopFlashing(){ 
    cameraIsFlashing = false; 
    // Cancel/Stop your timers 
    onTimer.cancel; 
} 
0

調用取消(上線定時器)和清除()停止線程。
如下所示。

private void cameraOff() { 
// TODO Auto-generated method stub 
if(timer != null){ 
parameters.setFlashMode(Parameters.FLASH_MODE_OFF); 
camera.setParameters(parameters); 
camera.release(); 
camera = null; 

timer.cancel();// cancel and releases 
timer.purge(); 
} 
} 
0

爲計時器任務創建一個變量,而不是使用匿名類。先取消定時器任務,然後取消定時器