上次視頻中著重介紹了 AsyncTask 的使用和應該注意點的三個點,而這次視頻中主要介紹了 Handler,視頻地址如下:
下面就開始我們的視頻內容學習吧。
我們知道你喜歡使用線程,它確實幫我解決了不少問題,對于?99% 的線程需求,AsyncTask 是正確的解決方案(雖然感覺已經很少人還會用它了)。
但對于一些其它的任務,如果這些任務不需要處理 UI 更新,那么 HandlerThread 是一個非常不錯的選擇。
你現在有一些任務,你要將它從主線程扔到工作線程上去執行,并在任務結束后將結果拿回到線程進行一些更新操作,這種情況下 AsyncTask 可以解決,因為它里面封裝了這些操作,將任務有主線程推到工作線程濱江結果再返回到主線程上。
但 AsyncTask 也并不能解決每類問題。
這邊有一個例子(視頻中的例子我可能翻譯不是很好),考慮到從相機獲取預覽框,這些預覽通過 onPreviewFrame() 方法回調給你,并且這個回調在調用打開相功能的線程上被回調。
如果這個會調用在主線程上,那么處理回調任務可能會干擾到主線程本應該處理的 UI 渲染或者事件處理。
如果使用 AsyncTask 也一樣,會影響其他 AsyncTask 執行任務(AsyncTask ?默認是順序執行的)。
如果沒有 UI,沒有 AsyncTask 線程,那么你可以接收一個長時間運行的任務并接收回調,那么 HandlerThread 是一個不錯的選擇。
HandlerThread 有效的運行著一個長時間活躍的線程,從隊列中拿到任務并執行它們,HandlerThread 結合 Android 中一些其他的功能,如 Looper,保持運行的線程,持有消息的隊列以及一個 Handler 對象,Handler 對象管理著每個任何插入到消息隊列中。
現在看來你可以在 HandlerThread 中打開相機,onPreviewFrame() 會在 HandlerThread 上被回調。
所以如果你打算執行一個長時間運行的任務,那么使用 HandlerThread 看來是個不錯的選擇。
HandlerThread 中的任務想要將結果返回給主線程也是輕而易舉的,直接使用 runOnUIThread 命令即可。
所以 HandlerThread 確實在某些場景下使用很有幫助,一個長時間運行且沒有 UI 交互的任務,就像在將用戶數據上傳到服務器前進行的數據壓縮。
順便記住,當你創建 HandlerThread 時,別忘了基于任務類型設置線程的優先級,我是說,記住,CPUs 只能并行處理少量線程工作,所以設置優先級可以幫助系統知道,當其他線程在正確執行的時候任務的正確的執行順序。
翻譯不是很好,我會盡力提升自己的英文水平的。