HandlerThread的使用以及原理

2021-08-21 05:54:15 字數 1637 閱讀 6252

官方的描述:handlerthread 是乙個包含 looper 的 thread,我們可以直接使用這個 looper 建立 handler。

handlerthread 的使用場景

我們知道,handlerthread 所做的就是在新開的子執行緒中建立了 looper,那它的使用場景就是 thread + looper 使用場景的結合,即:在子執行緒中執行耗時的、可能有多個任務的操作。

比如說多個網路請求操作,或者多檔案 i/o 等等。

舉個栗子

public

class

downloadthread

extends

handlerthread

implements

handler.callback

@override

protected

void

onlooperprepared()

//將接收到的任務訊息挨個新增到訊息佇列中

for (string url : mdownloadurllist)

}public

void

setdownloadurls(string... urls)

public handler getuihandler()

//注入主線程 handler

public downloadthread setuihandler(final handler uihandler)

/*** 子執行緒中執行任務,完成後傳送訊息到主線程

**@param msg

*@return

*/@override

public

boolean

handlemessage(final message msg)

string url = (string) msg.getdata().get(key_url);

muihandler.sendmessage(startmsg);

muihandler.sendmessage(finishmsg);

return

true;

}@override

public

boolean

quitsafely()

}

用法

一般情況下,我們會經常用handler在子執行緒中更新ui執行緒,那是因為在主線程中有looper迴圈,而handlerthread新建擁有loop

er的子執行緒又有什麼用呢?

必然是執行耗時操作。舉個例子,資料實時更新,我們每10秒需要切換一下顯示的資料,如果我們將這種長時間的反覆呼叫操作放到ui執行緒中,雖說可以執行,但是這樣的操作多了之後,很容易會讓ui執行緒卡頓甚至崩潰。

於是,就必須在子執行緒中呼叫這些了。

handlerthread繼承自thread,一般適應的場景,便是集thread和handler之所長,適用於會長時間在後台執行,並且間隔時間內(或適當情況下)會呼叫的情況,比如上面所說的實時更新。

其實使用handlerthread的效果和使用thread+handler差不多。不過後者對開發者的要求更高。

handlerthread的特點

參考文章:

HandlerThread 學習筆記

1.handler handler會關聯乙個單獨的執行緒和訊息佇列。handler預設關聯主線程,雖然要提供runnable引數 但預設是直接呼叫runnable中的run 方法。也就是預設下會在主線程執行,如果在這裡面的操作會有阻塞,介面也會卡住。如果要在其他執行緒執行,可以使用handlerth...

HandlerThread執行緒管理

使用過程 1。新建乙個handlerthread物件 myhandlerthread mhandlerthread new myhandlerthread testtraffichandlerthread 2。使用post方法將runnable物件加入這個執行緒的佇列 mhandlerthread....

多執行緒 handlerthread

當我們需要工作執行緒來操作的時候,很多時候會有同步問題,ui更新問題。handle機制就是為了解決這個問題而產生的。android允許每個執行緒都有自己的訊息佇列,同時也可以是主線程訊息佇列。但是很多時候,我們希望可以快速的建立乙個支援自己訊息佇列的android執行緒,這個時候handlerthr...