終止Android中HandlerThread的方法
轉自:http://blog.csdn.net/gemmem/article/details/7932655
如果我們在 activity中start了一個HandlerThread,那麼這個執行緒會啟動一個looper訊息迴圈,當activity退出了,這個HandlerThread執行緒並沒有終止,還是在那裡做looper死迴圈,這當然不是我們願意看到的,因為隨著activity的建立和退出的次數增多,這樣的無用執行緒會越來越多,佔用系統資源,最終導致程式crash掉。
我們希望,當HandlerThread已經沒有利用價值的時候,將它停止掉,只有這樣才能開發出健壯的Android程式。
那麼如何停止一個已經啟動了的HandlerThread呢?
看看 Looper.loop()的核心程式碼:
- while (true) {
- Message msg = queue.next(); // might block
- if (msg != null) {
- if (msg.target == null) {
- // No target is a magic identifier for the quit message.
- return;
- }
- long wallStart = 0;
- long threadStart = 0;
- // This must be in a local variable, in case a UI event sets the logger
- Printer logging = me.mLogging;
- if (logging != null) {
- logging.println(">>>>> Dispatching to " + msg.target + " " +
- msg.callback + ": " + msg.what);
- wallStart = SystemClock.currentTimeMicro();
- threadStart = SystemClock.currentThreadTimeMicro();
- }
- msg.target.dispatchMessage(msg);
我看到裡面是一個無限迴圈,退出迴圈的條件是:msg.target == null;
也就是說,如果我們向此looper的MessageQueue傳送一個target為null的message,就可以停止這個執行緒的遠行。
繼續看Looper.java的程式碼:
會發現有一個方法:
- public void quit() {
- Message msg = Message.obtain();
- // NOTE: By enqueueing directly into the message queue, the
- // message is left with a null target. This is how we know it is
- // a quit message.
- mQueue.enqueueMessage(msg, 0);
- }
停止HandlerThread的方法終於找到了,就是使用quit方法,具體呼叫形式如下:
mHandlerThread.getLooper().quit();
相關文章
- Android 中的 HandlerThread 詳解Androidthread
- Java 終止執行緒方法Java執行緒
- 建立索引意外終止解決方法索引
- 終止java執行緒的2種方法Java執行緒
- mysqldump意外終止的原因以及解決方法MySql
- Android中HandlerThread的使用及原始碼解析Androidthread原始碼
- 終止expdp正在執行中的匯出任務
- 終止指定埠的程式
- 終止imp/exp和expdp/impdp程式執行的方法
- 在Visual Basic中終止Windows 95 (轉)Windows
- Windows 程式的建立和終止Windows
- Android HandlerThread使用總結Androidthread
- Linux中EOF自定義終止符介紹Linux
- Go的優雅終止姿勢Go
- 問題:執行緒的終止執行緒
- 兩階段終止模式模式
- 終止非同步任務非同步
- 在開發過程中終止一個專案的想法
- Android中文API(128) —— HandlerThreadAndroidAPIthread
- javascript如何終止函式的執行JavaScript函式
- TCP/IP之TCP的建立與終止TCP
- 終止程式的工具 kill 、killall、pkill、xkill
- Docker 容器優雅終止方案Docker
- 你可以終止 forEach 嗎?
- TCP連線是如何建立和終止的?TCP
- win10電腦藍屏終止程式碼memory management的解決方法Win10
- 談談Object類的終止器的實現!Object
- AngularJS終止了長期支援AngularJS
- Thread執行緒終止interruptthread執行緒
- Activiti7 結束/終止流程
- AWS RDS for MySQL如何終止會話MySql會話
- db2 語句終止符DB2
- 終止oracle日誌分析事務Oracle
- Java執行緒中斷與終止執行緒執行Java執行緒
- Android後臺任務(HandlerThread、AsyncTask、IntentService)AndroidthreadIntent
- win10藍屏終止程式碼badpoolheader的最佳解決方法Win10Header
- 【Linux】程式終止方式--exit的呼叫過程!!!Linux
- oracle 如何終止儲存過程的執行Oracle儲存過程