一般會使用handler handler = new handler()建立。這樣建立的handler是在主線程即ui執行緒下的handler,即這個handler是與ui執行緒下的預設looper繫結的。looper是用於實現訊息佇列和訊息迴圈機制的。
因此,如果是預設建立handler那麼如果執行緒是做一些耗時操作如網路獲取資料等操作,這樣建立handler是不行的。
2、使用handlerthread
handlerthread實際上就乙個thread,只不過它比普通的thread多了乙個looper。我們可以使用下面的例子建立handler
handlerthread thread = new handlerthread("myhandlerthread");
thread.start();
mhandler = new handler(thread.getlooper());
mhandler.post(mbackgroundrunnable);
建立handlerthread時要把它啟動了,即呼叫start()方法。然後建立handler時將handlerthread中的looper物件傳入。那麼這個mhandler物件就是與handlerthread這個執行緒繫結了(這時就不再是與ui執行緒繫結了,這樣它處理耗時操作將不會阻塞ui)。
最後把實現耗時操作的執行緒post到mhandler的訊息佇列裡面。注意的是,mbackgroundrunnable這個執行緒並沒有啟動,因為沒有呼叫start()方法。
3、完整的angrycode
用上面的方式來建立執行緒,在銷毀時就可以使用
mhandler.removecallbacks(mbackgroundrunnable);
銷毀乙個執行緒,這樣就可以避免在多次進入同乙個activity時建立多個同時執行著的執行緒。
關於android 執行緒的銷毀問題
最近在做乙個android上的遊戲,用到了多個執行緒,當一切準備基本完成時出現了乙個小問題,選擇退出時finish掉了乙個activity但是裡面的執行緒卻沒辦法結束掉,因此就算退出了遊戲等到執行緒結束時該執行的頁面還是會跳出乙個activity,原來finish乙個activity並不能結束掉乙個...
Android 執行緒和Timer的銷毀
在android開發中,經常會用到執行緒和timer,如果沒有主動關閉它們,當程式結束時,執行緒並沒有被銷毀,而是一直在後台執行著,當我們重新啟動應用時,又會重新啟動乙個執行緒,周而復始,你啟動應用次數越多,開啟的執行緒數就越多,你的機器就會變得越慢。還會導致意思不到的錯誤。1 執行緒的銷毀 han...
C 物件的建立與銷毀
class x class x class x 轉換建構函式,可以將int轉換為x型別 void f x obj intmain class x 說明這是普通的建構函式,不能在需要型別轉換時呼叫 錯誤原因就是淺拷貝函式把b的 r 和 p 都賦成了a中m的位址。我們這時要自己定義乙個建構函式 拷貝建構...