Update UI with handler
- Activity 建立時會產生自己的一個 mLooper 來做無限循環監聽 msgQueue
- 使用者建立新mHandler 來預置更新 UI 的動作,由於new Handler時會call Looper.myLooper來取得當前thread 的Looper,因此會綁定在 mLooper
- 使用者建立新thread ,並使用 mHandler.sendMessage 傳送訊息msg
- sendMessage 會走到 sendMassageAtTime, mHandler 和msg 會在此相互綁定,並透過 enqueueMessage 放入msgQueue 中
- mLooper 會將 msg拉出來,並取出其中的 mHandler 並執行mHandler.handleMessage
- 由於此時handleMessage 的 caller為 Activity 的looper ,也就是處於UI thread 下,這樣就可以進行更新UI的動作
Summary
Handler持有looper,looper會有一個messageQueue,messageQueue有多個message。設定IdleHandler可以在MeesageQueue裡的東西還沒必要執行時,在中間的空閑時間啟動,並依照回傳值決定是否要再繼續執行,也可以用來在message處理完時作為結束looper的方式。looper結束可以用quit結束,會無法再送入訊息,並且會將佇列裡的全數刪除,如果是quitSafely則只是丟棄時間點還沒到的message。一個thread只會有一個looper且不能重複使用,所以當一個thread或looper停止後,就得再重新打開才可使用。
Handler可以處理任務訊息和一般訊息,任務訊息會直接執行,而一般訊息在message有設定callback時可以做兩層處置,並依照callback的回傳結果決定是否要繼續執行handler本身的handleMessage,message是否需要被處理是依照其設定的時間點。