2012-11-28 47 views
1

我需要在应用程序暂停之前销毁一个线程。这是我的代码:不能等待线程结束onPause

public class MyThread extends Thread 
{ 
    public boolean mRun = false;; 
    @Override 
    public void run() 
    { 
     while (mRun) 
     { 
       ..... 
     } 
    } 
} 

活动:

@Override 
public void onPause() { 
    if (mThread != null) 
    {  
     mThread.mRun = false;   
     try { mThread.join(); } 
     catch (InterruptedException e) { } 
    } 
    super.onPause(); 
} 

但我敢肯定的是,Android系统不等待我的线程的结论和之前暂停我的应用程序。我如何强制线程结论?

+0

没有至少记录它不捕获异常。无论如何,你不能让用户在做任何事情之前等待线程潜在终止。 – njzk2

回答

1

这是这样的,我在我的代码使用满足您requirement.Hope,这将帮助你。如果您找到更好的解决方案,请分享。

在下面的代码片段,mThread是线程获得在onCreate创建。 OnDestroy是一种在您的活动被破坏之前调用的方法。它是清空已分配资源的最佳位置。

@Override 
public void onDestroy() { 
    super.onDestroy(); 
    if(null != mThread) { 
     Thread dummyThread = mThread; 
     mThread = null; 
     dummyThread.interrupt(); // Post an interrupt request to this thread. 
     } 
} 

干杯!

+0

请注意,除非线程处于等待状态()或阻塞I/O中断,否则中断请求本身不会有很多功能 – njzk2

0

您确定没有收到InterruptedException? 尝试把一个stacktrace放在catch语句中,并检查你的线程是否为alive()。

0

你不能那样做。 Thread.join是一个阻止潜在的长操作,不能在UI线程上完成(onPause在UI线程上)。

你可以问问你的线程停止,(mRun设置为false是这样做的一个普遍接受的方式),但你不能exclicitely等待就可以了。

0

可以肯定,标志着线程作为守护,随时检查一个标志,如果在一个线程做重复的工作,就像在一个循环。此外,呼叫中断,这将负责阻止IO或网络呼叫。

myThread.setDaemon(true) 

cancelFlag = true; 
myThread.interrupt();