2012-05-11 45 views
2

我在我的Android活動中使用了一些線程對象。但是當這些線程在摧毀時不會停止。我的線程停止代碼如下:如何在Android上銷燬Activity時停止正在運行的線程?

@Override 
public void onDestroy() { 
    super.onDestroy(); 
    thread.interrupt(); 
} 

上面的代碼不僅適用於線程對象停止,而且還會引發InterruptedException。沒有例外的情況下停止正在運行的線程的正確方法是什麼?


線程對象拋出InterruptedException時它不是錯誤嗎?

+0

試試這個:http://stackoverflow.com/questions/9699292/how-to-stop-all-worker-threads-in-android-application – idiottiger

回答

-2

添加finish();應當在調用onDestroy()或其他任何按鈕(例如按下按鈕)時結束Activity。當您使用onDestroy()時,確保在調用其他所有內容之後放置super.onDestroy();

+0

嗨,這是不斷拋出InterruptedException異常後,我加入了終點()函數調用。我應該重寫一些方法到我的Runnable類嗎?順便說一下,我沒有點擊-1按鈕到您的文章 – Ack

2

試試這個方法:

volatile boolean stop = false; 

public void run() { 
    while (!stop) { 
    log.v("Thread", "Thread running..."); 
     try { 
     Thread.sleep(1000); 
     } catch (InterruptedException e) { 
     log.v("Thread","Thread interrupted..."); 
     } 
    } 
} 

@Override 
public void onDestroy() { 
    stop = true; 
    super.onDestroy(); 

} 

@Override 
public void onDestroy() { 
    thread.interrupt(); 
    super.onDestroy(); 
} 
+0

因此,線程對象拋出InterruptedException時不是錯誤嗎? – Ack

0

試圖從外部停止線程是不可靠的。

我建議使用全球PARAM在您的應用程序
使用SharePreferences或應用程序環境(例如IS_APP_ACTIVE),並讓線程殺死自己。

讓我嘗試解釋一下......

在活動

protected void onResume() { 
     super.onResume(); 

// isAppActive 
     CommonUtils.setAppActive(mContext, true); 
} 

protected void onPause() { 
     super.onPause(); 

// isAppActive 
     CommonUtils.setAppActive(mContext, true); 
} 

在你的線程

if (!CommonUtils.isAppActive(mContext)) 

剛剛走出線程循環。

0

我這樣做。 在您的活動

@Override 
public void onDestroy() { 
    super.onDestroy(); 
    thread.interrupt(); 
} 

在你的線程

@Override 
public void run() { 
    // stop your thread 
    if (interrupted()) { 
     return; 
    } 
    // do your work 
} 
-1

我們不能殺死一個線程。唯一的辦法是:

class MyThread extends Thread 
    { 
     void run() 
     { 
    while(bool){ 
      //My code which takes time. 
     } 
    } 
    } 

// --------------------------要運行的線程

MyThread mThread = new MyThread(); 
    mThread.start(); 

現在,當你想停止線程...只需將布爾值更改爲false

bool=false; 
相關問題