2015年4月19日 星期日

談一下執行緒的中斷

Android真是個麻煩的多工系統, 因它不允許你在主線程(以C來說就是main()程式)裡有死迴圈或超過5秒的迴圈, 一超過跟刷機失則一樣, 直接就黑屏了...

但是像我們要使用藍芽來溝通, 連線時, Server端不就是一直在那兒等, 當然是在死迴圈裡執行, 等候遠方的訊息傳來時, 再傳給Server的主線程去顯示傳來的訊息, 在Android就只能用Thread(執行緒), 就很像是找另一個專人來負責這個死迴圈, 只是申請這個人的程序有點煩, 藍芽結束連線後, 要解僱這個人也是煩, 到處都有陷阱, 如果用完後沒有順利的把它解僱, 下次再執行, 藍芽就會怪里怪氣的, 時好時不好, 讓你煩到底, 因為自己遇到了, 所以就把它寫下來記綠一下


步驟(1)先宣告一個死迴圈的執行條件旗標

boolean mAcceptThread = true;

步驟(2)把你的Thread裡的迴圈條件加上剛才宣告的迴圈執行條件旗標

while (mAcceptThread) {
     ...
     ...
//你的死迴圈內容
     ...
     ...
}

步驟(3)在程式要結束時, 執行中斷執行緒

protected void onDestroy() {

if(mAcceptThread != null ) {
mAcceptThread.cancel();  //取消執行緒
mAcceptThread = false; //把迴圈執行條件旗標變成false, 這樣死迴圈就不執行了
mAcceptThread.interrupt(); //再中斷一下執行緒, 讓迴圈執行條件旗標發揮作用
mAcceptThread = null;  //最後讓執行緒 = null
}
}

在debug時, 可以用下列程式碼來取得執行緒到底是Runnable還是Terminated
State mAcceptThreadStatus = mAcceptThread.getState();
if(D) Log.d(TAG, "mAcceptThread state = " + mAcceptThreadStatus);

收工

沒有留言:

張貼留言

歡迎大家來討論交流一下~~~