- 它有什么能力和作用?
查看MessageQueue中的IdleHandler源碼發(fā)現(xiàn),當(dāng)消息隊列空閑時會執(zhí)行IdleHandler的queueIdle()方法见妒,該方法返回一個boolean值疟赊,如果為false則執(zhí)行完畢之后移除這條消息,如果為true則保留峡碉,等到下次空閑時會再次執(zhí)行近哟,查看MessageQueue的next()方法可以發(fā)現(xiàn)確實是這樣
處理完IdleHandler后會將nextPollTimeoutMillis設(shè)置為0,也就是不阻塞消息隊列鲫寄,當(dāng)然要注意這里執(zhí)行的代碼同樣不能太耗時吉执,因為它是同步執(zhí)行的疯淫,如果太耗時肯定會影響后面的message執(zhí)行。
能力大概就是上面講的那樣戳玫,那么能力決定用處熙掺,用處從本質(zhì)上講就是趁著消息隊列空閑的時候干點事情,當(dāng)然具體的用處還是要看具體的處理咕宿。
- 有什么適用的場景?
要使用IdleHandler只需要調(diào)用MessageQueue#addIdleHandler(IdleHandler handler)方法即可
合適場景可以從以下一點或幾點出發(fā)
- 消息隊列相關(guān)
- 主線程能干的事情
- 返回true和false帶來的不同結(jié)果
目前可以想到的場景
- Activity啟動優(yōu)化:onCreate币绩,onStart,onResume中耗時較短但非必要的代碼可以放到IdleHandler中執(zhí)行府阀,減少啟動時間
- 想要在一個View繪制完成之后添加其他依賴于這個View的View缆镣,當(dāng)然這個用View#post()也能實現(xiàn),區(qū)別就是前者會在消息隊列空閑時執(zhí)行
- 發(fā)送一個返回true的IdleHandler试浙,在里面讓某個View不停閃爍董瞻,這樣當(dāng)用戶發(fā)呆時就可以誘導(dǎo)用戶點擊這個View,這也是種很酷的操作
- 一些第三方庫中有使用田巴,比如LeakCanary钠糊,Glide中有使用到