1

我需要在应用程序挂起之前销毁一个线程。这是我的代码:

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系统不会等待我的线程结束并在它之前暂停我的应用程序。我如何强制线程结论?

4

4 回答 4

1

这就是我在代码中使用的方式满足您的要求。希望这对您也有帮助。如果您找到更好的解决方案,请分享。

在下面的代码片段中,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.
       }
}

干杯!

于 2012-11-28T08:34:01.353 回答
0

您确定没有收到 InterruptedException 吗?尝试在 catch 语句中添加一个堆栈跟踪...并检查您的线程是否为 isAlive()。

于 2012-11-28T08:30:17.380 回答
0

你不能这样做。Thread.join 是一个潜在的阻塞操作,不能在 UI 线程上执行(onPause 在 UI 线程上)。

您可以要求您的线程停止,(将 mRun 设置为 false 是一种普遍接受的这样做方式),但您不能明确地等待它。

于 2012-11-28T08:37:20.893 回答
0

可以肯定的是,将线程标记为守护进程,如果在线程中执行重复性任务(例如在循环中),请始终检查标志。此外,调用中断将负责阻塞 IO 或网络调用。

myThread.setDaemon(true)

cancelFlag = true;
myThread.interrupt(); 
于 2012-11-28T09:33:19.277 回答