2012-11-28 121 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();