2012-09-01 44 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

我试过这个,但手电筒仍然工作。它在应用程序退出后仍然有效。 –