前幾天聽同事講有個 idleHandler 能夠不和主線程其它工做爭搶,能夠作到空閒時候運行。當時想着這一塊好像有點印象,記得在看 handler 源碼時候看到 message 獲取後面還有一段有關 idle 的代碼,可是沒有細看。這麼一想,看源碼仍是不夠仔細啊。雖然感受這個實際上應該是在 message 爲空的時候而後執行任務,思路挺簡單明瞭的。可是今天正好有空,就好好看了一下源碼,順便查漏補缺。android
很輕鬆的找到 MessageQueue.IdleHandler,裏面就一個接口方法 queueIdle 須要實現。看註釋是返回 true 則保持,返回 false 則執行完刪除。在 next 方法裏能夠看到當前沒有要執行的消息或者還沒到執行時間會往下查看有沒有 idle 想要運行,有則運行,沒有則返回。但裏面仍然不能作耗時操做。這種適用場景挺少的。線程
建議慎用只在有些界面加載不急的時候能夠放在這裏。由於有的可能認爲不怎麼耗時,可是一用的多了就比較容易出 anr,並且還很難查,我這塊不是耗時操做啊,爲何會 anr,可能就是由於你們都怎麼想,結果可想而知,anr 會愈來愈多,也愈來愈難查,千萬不要開這個頭。其實既然加載或者初始化操做能夠延遲,那爲何不直接放在子線程而要放在主線程。而且 android 系統內部使用也不多,主要是 gc 那塊使用了,doGcIfNeeded()。接口
因此 idleHandler 不是天堂,被濫用會致使很麻煩的 anr 問題,謹慎使用。源碼
ps:感受 android 有不少坑在,好比 Handler,本覺得消耗很低啊,這麼好用,等待過程還會被掛起,簡直是神器。可是在深刻下去會發現,其實 它底層用管道,經過監聽來實現。一個 Handler 至少持有 4 個fd。雖然採用 epoll_wait 儘量高效,可是之後也不敢在隨意使用。畢竟看到 fd 超過限制的錯誤仍是很多的。it