Handler 允許我們發送延時訊息,如果在延時期間用戶關閉了 Activity,那么該 Activity 會泄露,這個泄露是因為 Message 會持有 Handler,而又因為 Java 的特性,內部類會持有外部類,使得 Activity 會被 Handler 持有,這樣最終就 導致 Activity 泄露,
解決:將 Handler 定義成靜態的內部類,在內部持有 Activity 的弱參考,并在 Acitivity 的 onDestroy()中handler.removeCallbacksAndMessages(null)及時 移除所有訊息,
為什么我們能在主執行緒直接使用 Handler,而不需要創建 Looper ?
通常我們認為 ActivityThread 就是主執行緒,事實上它并不是一個執行緒,而是主 執行緒操作的管理者,在 ActivityThread.main() 方法中呼叫了 Looper.prepareMainLooper() 方法創建了 主執行緒的 Looper ,并且呼叫了 loop() 方法,所以我們就可以直接使用 Handler 了,因此我們可以利用 Callback 這個攔截機制來攔截 Handler 的訊息,如大部分 插件化框架中 Hook ActivityThread.mH 的處理
主執行緒不允許退出,退出就意味 APP 要掛,
Handler 里藏著的 Callback 能干什么?Handler.Callback 有優先處理訊息的權利 ,當一條訊息被 Callback 處理并攔截 (回傳 true),那么 Handler 的 handleMessage(msg) 方法就不會被呼叫了;如果 Callback 處理了訊息,但是并沒有攔截,那么就意味著一個訊息可以同時 被 Callback 以及 Handler 處理,
創建 Message 實體的最佳方式 為了節省開銷,Android 給 Message 設計了回識訓制,所以我們在使用的時候 盡量復用 Message ,減少記憶體消耗:? 通過 Message 的靜態方法 Message.obtain();? 通過 Handler 的公有方法 handler.obtainMessage(),
子執行緒里彈 Toast 的正確姿勢 本質上是因為 Toast 的實作依賴于 Handler,按子執行緒使用 Handler 的要求修 改即可,同理的還有 Dialog,妙用 Looper 機制 ? 將 Runnable post 到主執行緒執行;? 利用 Looper 判斷當前執行緒是否是主執行緒,

轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/281675.html
標籤:其他
