達內-關於Android 線程的銷毀

來源:互聯網
上載者:User

在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方法,使整個程式(所有線程)終止。


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

終止線程運行,一般都是設定一個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(); -------------------------------------------- 要終止迴圈,只需要這樣 //----------------------------------------------------------------------------- 


作者 sdtarena

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.