終止Android中HandlerThread的方法

yangxi_001發表於2014-02-24

轉自:http://blog.csdn.net/gemmem/article/details/7932655

如果我們在 activity中start了一個HandlerThread,那麼這個執行緒會啟動一個looper訊息迴圈,當activity退出了,這個HandlerThread執行緒並沒有終止,還是在那裡做looper死迴圈,這當然不是我們願意看到的,因為隨著activity的建立和退出的次數增多,這樣的無用執行緒會越來越多,佔用系統資源,最終導致程式crash掉。

我們希望,當HandlerThread已經沒有利用價值的時候,將它停止掉,只有這樣才能開發出健壯的Android程式。


那麼如何停止一個已經啟動了的HandlerThread呢?

看看 Looper.loop()的核心程式碼:


[java] view plaincopy
  1. while (true) {  
  2.     Message msg = queue.next(); // might block  
  3.     if (msg != null) {  
  4.         if (msg.target == null) {  
  5.             // No target is a magic identifier for the quit message.  
  6.             return;  
  7.         }  
  8.   
  9.         long wallStart = 0;  
  10.         long threadStart = 0;  
  11.   
  12.         // This must be in a local variable, in case a UI event sets the logger  
  13.         Printer logging = me.mLogging;  
  14.         if (logging != null) {  
  15.             logging.println(">>>>> Dispatching to " + msg.target + " " +  
  16.                     msg.callback + ": " + msg.what);  
  17.             wallStart = SystemClock.currentTimeMicro();  
  18.             threadStart = SystemClock.currentThreadTimeMicro();  
  19.         }  
  20.   
  21.         msg.target.dispatchMessage(msg);  


我看到裡面是一個無限迴圈,退出迴圈的條件是:msg.target == null;

也就是說,如果我們向此looper的MessageQueue傳送一個target為null的message,就可以停止這個執行緒的遠行。


繼續看Looper.java的程式碼:

會發現有一個方法:

[java] view plaincopy
  1. public void quit() {  
  2.     Message msg = Message.obtain();  
  3.     // NOTE: By enqueueing directly into the message queue, the  
  4.     // message is left with a null target.  This is how we know it is  
  5.     // a quit message.  
  6.     mQueue.enqueueMessage(msg, 0);  
  7. }  
這個方法正是向MessageQueue傳送了一個target為null的message!

停止HandlerThread的方法終於找到了,就是使用quit方法,具體呼叫形式如下:

mHandlerThread.getLooper().quit();


相關文章