Getting a HandlerThread. (Android Performance Patterns Season 5, Ep. 5)

上次視頻中著重介紹了 AsyncTask 的使用和應(yīng)該注意點(diǎn)的三個(gè)點(diǎn),而這次視頻中主要介紹了 Handler,視頻地址如下:

https://www.youtube.com/watch?v=adPLIAnx9og

下面就開始我們的視頻內(nèi)容學(xué)習(xí)吧。

我們知道你喜歡使用線程,它確實(shí)幫我解決了不少問題,對(duì)于?99% 的線程需求,AsyncTask 是正確的解決方案(雖然感覺已經(jīng)很少人還會(huì)用它了)。

但對(duì)于一些其它的任務(wù),如果這些任務(wù)不需要處理 UI 更新,那么 HandlerThread 是一個(gè)非常不錯(cuò)的選擇。

你現(xiàn)在有一些任務(wù),你要將它從主線程扔到工作線程上去執(zhí)行,并在任務(wù)結(jié)束后將結(jié)果拿回到線程進(jìn)行一些更新操作,這種情況下 AsyncTask 可以解決,因?yàn)樗锩娣庋b了這些操作,將任務(wù)有主線程推到工作線程濱江結(jié)果再返回到主線程上。

AsyncTask

但 AsyncTask 也并不能解決每類問題。

這邊有一個(gè)例子(視頻中的例子我可能翻譯不是很好),考慮到從相機(jī)獲取預(yù)覽框,這些預(yù)覽通過 onPreviewFrame() 方法回調(diào)給你,并且這個(gè)回調(diào)在調(diào)用打開相功能的線程上被回調(diào)。


Camera Preview

如果這個(gè)會(huì)調(diào)用在主線程上,那么處理回調(diào)任務(wù)可能會(huì)干擾到主線程本應(yīng)該處理的 UI 渲染或者事件處理。

回調(diào)任務(wù)時(shí)間很長影響到了主線程工作

如果使用 AsyncTask 也一樣,會(huì)影響其他 AsyncTask 執(zhí)行任務(wù)(AsyncTask ?默認(rèn)是順序執(zhí)行的)。

如果沒有 UI,沒有 AsyncTask 線程,那么你可以接收一個(gè)長時(shí)間運(yùn)行的任務(wù)并接收回調(diào),那么 HandlerThread 是一個(gè)不錯(cuò)的選擇。

HandlerThread

HandlerThread 有效的運(yùn)行著一個(gè)長時(shí)間活躍的線程,從隊(duì)列中拿到任務(wù)并執(zhí)行它們,HandlerThread 結(jié)合 Android 中一些其他的功能,如 Looper,保持運(yùn)行的線程,持有消息的隊(duì)列以及一個(gè) Handler 對(duì)象,Handler 對(duì)象管理著每個(gè)任何插入到消息隊(duì)列中。

現(xiàn)在看來你可以在 HandlerThread 中打開相機(jī),onPreviewFrame() 會(huì)在 HandlerThread 上被回調(diào)。

在 HandlerThread 中進(jìn)行剛才例子中的操作

所以如果你打算執(zhí)行一個(gè)長時(shí)間運(yùn)行的任務(wù),那么使用 HandlerThread 看來是個(gè)不錯(cuò)的選擇。

HandlerThread 中的任務(wù)想要將結(jié)果返回給主線程也是輕而易舉的,直接使用 runOnUIThread 命令即可。

所以 HandlerThread 確實(shí)在某些場景下使用很有幫助,一個(gè)長時(shí)間運(yùn)行且沒有 UI 交互的任務(wù),就像在將用戶數(shù)據(jù)上傳到服務(wù)器前進(jìn)行的數(shù)據(jù)壓縮。

上傳數(shù)據(jù)

順便記住,當(dāng)你創(chuàng)建 HandlerThread 時(shí),別忘了基于任務(wù)類型設(shè)置線程的優(yōu)先級(jí),我是說,記住,CPUs 只能并行處理少量線程工作,所以設(shè)置優(yōu)先級(jí)可以幫助系統(tǒng)知道,當(dāng)其他線程在正確執(zhí)行的時(shí)候任務(wù)的正確的執(zhí)行順序。

通過優(yōu)先級(jí)來設(shè)置任務(wù)的執(zhí)行順序

翻譯不是很好,我會(huì)盡力提升自己的英文水平的。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容