2012-07-10 160 views
0

我想在用户离开活动时停止线程。这听起来很简单,但没有功能,我试过,工作。停止线程onPause

我开始活动守则

lovi = new Intent(getApplicationContext(), listoverview.class); 
lovi.putExtra("reloadAll", true); 
startActivity(lovi); 

在listoverview的OnCreate我启动线程守则

rlMF.start(); 

而且rlMF看起来是这样的:

public Thread rlMF = new Thread(new Runnable() { 
    public void run() { 
     reloadMissingFiles(); 
    } 
}); 

我在onPause尝试使用rlMF.stop(),.interrupt(),.suspend。没有什么阻止它。

+1

你必须使用标志为此 – Akram 2012-07-10 07:29:24

回答

4

你必须添加一些标志来阻止它。以其他方式停止线程可能会产生可怕的后果,如资源泄漏。

例如:

volatile boolean activityStopped = false; 

在创建可运行:

public Thread rlMF = new Thread(new Runnable() { 

    public void run() { 
     while (!activityStopped) { 
     // reloadMissingFiles() should check the flag in reality 
      reloadMissingFiles(); 
     } 
    } 
}); 

在的onPause():

protected void onPause(){ 
    super.onPause(); 
    activityStopped = true; 
} 
+0

我这样做,它的作品“够好”。谢谢 :-) – Styler2go 2012-07-10 07:48:06

0

使用Android处理器

Runnable r = new Runnable() 
{ 
    public void run() 
    { 
     // do stuff 
     handler.post(this); 
    } 
}; 

handler.post(r); 

在的onPause:

protected void onPause(){ 
    super.onPause(); 
    handler.removeCallbacks(); 
} 
+0

我的函数'reloadMissingFiles( );'只运行一次(但很长一段时间)...所以我不知道我可以如何使用你的代码... – Styler2go 2012-07-10 07:36:07

+0

Remo ving回调不会阻止已经运行的代码完成。 – 2012-07-10 07:36:52

0

代替Thread尝试和使用AsyncTask,这样你可以调用AsyncTaskcancel(boolean mayInterruptIfRunning)方法。如果您使用cancel(true),则还应记住要捕获可能抛出的InteruptedException

这里的a usefull tutorialThreads,HandlersAsyncTask这可能会帮助你。