Handler / Looper / Message 主要的目的,主要在 Main UI thread / Sub thread 之間交換tag (Message的what & obj),然後透過這個tag進行某些事情的處理,例如trigger一個動作,或者更新 Main UI
就我的認知做個簡單的定義:
l Handler:
1. Main thread / Sub thread都可以有Handler,但是只有Main thread的Handler可以更新UI。
2. Handler透過obtainMessage() 打包Message送出
3. Handler透過sendMessage() 把Message送給Looper。Looper一收到sendMessage(),就去Message Pool把Message撈出來,然後Call back給Handler的handleMessage() 做處理。
l Looper:
1. Main thread / Sub thread都可以有Looper,但是預設只有Main thread會create。Sub thread的Looper要自己create (透過prepare)。
2. 可以調用Main thread / Sub thread的Looper,透過getMainLooper() or myLooper() 來調用。
l Message Queue:
1. Main thread / Sub thread都可以有Message queue,但是預設只有Main thread會create。Sub thread的要自己create (透過prepare)。
2. Looper一旦建立了,相對應的Message queue就會產生。
在Study大陸一些博客和高煥堂老師的文章後,發覺主要有四種應用模式:
1. Main thread -> (Send msg) -> Main thread -> Handler(Main thread) -> (Display on Main UI)
2. Main thread -> (Send msg) -> Sub thread -> Handler(Main thread) -> (Display on Main UI)
3. Sub thread -> (Send msg) -> Main thread -> Handler(Main thread) -> (Display on Main UI)
4. Sub thread -> (Send msg) -> Sub thread -> Handler(Main thread) -> (Display on Main UI)
整個過程就是在Main / Sub的Handler / Looper一直切換,而最終就是要靠Main thread的Handler來更新UI畫面,這也是Android對於畫面處理的唯一定義,如果從Sub thread直接更新UI,就會出現Exception。
Ref URL:
沒有留言:
張貼留言