Android銷燬執行緒的方式

yangxi_001發表於2014-02-24
Android開發中,經常會用到執行緒和Timer,如果沒有主動關閉它們,當程式結束時,執行緒並沒有被銷燬,而是一直在後臺執行著,當我們重新啟動應用時,又會重新啟動一個執行緒,周而復始,你啟動應用次數越多,開啟的執行緒數就越多,你的機器就會變得越慢。還會導致意想不到的錯誤。

1、執行緒的銷燬

Hanlder是執行緒與Activity通訊的橋樑,利用handler接收到任務執行緒,放到任務佇列裡面派對執行。


//呼叫該任務執行緒的run() 方法執行任務執行緒。

Handler updateBarHandler =new handler();
handler.post(Runnable Thread);

//移除handler裡的任務執行緒,呼叫執行緒的stop()方法,銷燬執行緒。
handler.removecallbacks(Runnable Thread);

一個簡單的例子如下:
import Android.app.Activity; 
import Android.os.Bundle; 
import Android.os.Handler; 
import Android.util.Log; 
public class HandlerThread extends Activity { 
private static final String TAG = "HandlerThread"; 
private Handler mHandler = new Handler(); 

private Runnable mRunnable = new Runnable() { 

public void run() { 
//為了方便 檢視,我們用Log列印出來 
Log.e(TAG, Thread.currentThread().getName() + "Thread run"); 


}; 
@Override 
public void onCreate(Bundle savedInstanceState) { 
super.onCreate(savedInstanceState); 
setContentView(R.layout.main); 
//通過Handler啟動執行緒 
mHandler.post(mRunnable); 


@Override 
protected void onDestroy() { 
//將執行緒銷燬掉 
mHandler.removeCallbacks(mRunnable); 
super.onDestroy(); 

}

2、Timer的銷燬

預設情況下,只要一個程式的timer執行緒在執行,那麼這個程式就會保持執行。當然,你可以通過以下四種方法終止一個timer執行緒:
a)呼叫timer的cancle方法。你可以從程式的任何地方呼叫此方法,甚至在一個timer task的run方法裡;
b)讓timer執行緒成為一個daemon執行緒(可以在建立timer時使用new Timer(true)達到這個目地),這樣當程式只有daemon執行緒的時候,它就會自動終止執行;
c)當timer相關的所有task執行完畢以後,刪除所有此timer物件的引用(置成null),這樣timer執行緒也會終止;
d)呼叫System.exit方法,使整個程式(所有執行緒)終止。

原文連結:http://www.linuxidc.com/Linux/2011-10/46145.htm

//-------------------------------------------------------------------------------------

終止執行緒執行,一般都是設定一個bool變數,線上程run方法內部判斷該變數的值,以便隨時結束執行緒的run()執行並退出。該bool值的改變,是線上程外部來操作的.

這到是個好辦法,但是我有多了執行緒,外部的一個bool變數改變了,所有的執行緒都變了,這樣還是不能控制某一個執行緒呀
搞個陣列或list,對應儲存每個執行緒的bool值

採用了類似於的辦法,用資料庫來控制的
//------------------------------------------------------------------------------------

執行緒像這樣: Thread{ boolean flag = fase; run(){ while(!flag){ } } } Thread t = new Thread(); t.start(); ----------------------------------------------------- 要終止迴圈,只需要這樣 t.flag=true; ================================================ 還有一種方式 執行緒像這樣: Thread{ run(){ while(true){ Thread.sleep(xxxx); } } } Thread t = new Thread(); t.start(); -------------------------------------------- 要終止迴圈,只需要這樣 t.interrupte(); 但是這裡要注意呼叫的時機,要在子執行緒執行了run方法裡面的sleep(xxxx)後xxxx時間之內呼叫。也就是子執行緒會睡一會,醒一會,睡一會,醒一會,要在子執行緒睡著的時候呼叫。
//----------------------------------------------------------------------------- 
http://wenwen.soso.com/z/q318950994.htm 

相關文章