2012-09-01 65 views
0

我正在使用線程來運行手電筒,並且我想在按下後退後停止該線程。按下後停止手電筒

我用下面的代碼來啓動線程:

progressDialog = new ProgressDialog(MainActivity.this); 
progressDialog.setMessage("Flashing..."); 
progressDialog.show(); 

thread = new Thread(MainActivity.this); 
thread.start(); 

和線程正在做:

public void run() { 
    isOn = false; 
    cam = Camera.open(); 
    p = cam.getParameters(); 
    try { 
     for (int i = 0; i < pattern.length; i++) { 
      if (isOn) { 
       p.setFlashMode(Parameters.FLASH_MODE_OFF); 
       cam.setParameters(p); 
       Thread.sleep(pattern[i]); 
       isOn = false; 
      } else { 
       p.setFlashMode(Parameters.FLASH_MODE_TORCH); 
       cam.setParameters(p); 
       Thread.sleep(pattern[i]); 
       isOn = true; 
      } 
     } 
    } 
    catch (InterruptedException e) { 
     e.printStackTrace(); 
    } 
    cam.release(); 
    handlerFinish.sendEmptyMessage(0); 
} 

private Handler handlerFinish = new Handler() { 
    @Override 
    public void handleMessage(Message msg) { 
     progressDialog.dismiss(); 
    } 
}; 

我已經試過這停下來,但只有被開除進度對話框但手電筒還在工作:

@Override 
public void onBackPressed() { 
    super.onBackPressed(); 
    p.setFlashMode(Parameters.FLASH_MODE_OFF); 
    cam.setParameters(p); 
    isOn = false; 
    thread.stop(); 
} 

我能做些什麼來實現我的目標(停止日讀完後按下手電筒)?

+0

嘗試的Thread.join(),而線程運行,直到停止 - 即等到線程停止,並試圖阻止它在嘗試sorrunded while循環趕上一次達到退出循環 –

回答

0

試試這個循環停止線程

boolean retry = true; 

    while (retry) { 

try { 

    thread.join(); 

    retry = false; 

    } catch (InterruptedException e) { 

    // try again shutting down the thread 

    } 

    } 
+0

對不起,我有點迷惑。你的意思是我仍然使用onBackPressed(),並將上面的代碼添加到線程來阻止它? –

+0

yap你可以使用這裏面後面按下而不是thred.stop作爲入侵線程是有點triky你可以reffer java join命令的進一步細節 –

+0

我試過這個,但手電筒仍然工作。它在應用程序退出後仍然有效。 –