Android:Handler學習總結

DM--Tutor發表於2012-11-03

有那些方法加入到主UI執行緒中執行

1.Activity.runonUiThread(Runnable)

2.View.post(Runnable); View.postDelay(Runnable,long)

3.Handler

4.AsyncTask

Handler的作用

1.執行計劃任務,你可以在預定的實現執行某些任務,可以模擬定時器

2.執行緒間通訊。在Android的通訊啟動時,會建立一個主執行緒,主執行緒會建立一個訊息佇列來處理各種訊息。當你建立子執行緒時,你可以在你的子執行緒中拿到父執行緒中建立的Handler物件,就可以通過該物件向父執行緒的訊息佇列傳送訊息了。由於Android要求在UI執行緒中更新介面,因此,可以通過該方法在其他執行緒中更新介面。



3)確保操作始終在某個特定的執行緒中執行。例如當我們從資料庫載入資料時,除了程式啟動時需要載入外,每當我們接收資料改變時也需要重新載入。為了確保資料的有效性(始終使用最後一次查詢得到的資料),並減小不必要的查詢操作,我們應當確保他們在同一個執行緒中執行。

角色描述

1.Looper:(相當於隧道) 一個執行緒可以產生一個Looper物件,由它來管理此執行緒裡的Message Queue(車隊,訊息隧道)

2.Handler:你可以構造Handler物件來與Looper溝通

3.Message Queue(訊息佇列):用來存放執行緒放入的訊息

4.執行緒:UI thread通常是main thread,而Android啟動程式時會替它建立一個Message Queue


Looper的實現:


當前執行緒有一個Looper這樣的迴圈在監聽訊息佇列,這是一個死迴圈,主執行緒好像可以不用管Looper,其他邏輯程式碼可以照常往下走,但這個又不是而外的執行緒,這不是和我們學習的常理相悖麼?
Looper由系統控制的迴圈。在我們的執行緒沒有新開,但是在系統裡面vm會有


其實Looper的實現和Windows程式設計的訊息機制非常相似

對於正在執行的Message,呼叫removeMessage會有什麼後果?

1.呼叫removeMessage移除一個還沒有開始執行的message,看看會有什麼效果?

那麼這個message就不會執行了

2.移除一個正在執行的message,觀察有什麼效果

 這個message如果被處理了,移除就沒有效果了


Handler其實很簡單

1.Handler例項與訊息處理是關聯的,傳送和接收要匹配

2.只能依附在HandlerThread

3.可以通過設定Looper來選擇依附的執行緒

4.所有的操作都是在同一個執行緒中

5.removeMessage只能移除佇列中的Message

6.如果只通過Handler.post()方法將執行緒壓入佇列時,直接呼叫的是執行緒的run()方法,則主執行緒和呼叫的執行緒處於

同一個執行緒中。


同一個HandlerThread可以有多個Handler麼? Yes

同一個HandlerThread中使用多個Handler Message會混淆麼? 為什麼?

 No 每一條訊息都有一個target欄位,這個target欄位就標識了是哪個handler



考核目標

1.使用Handler是非同步的,它會建立新執行緒嗎?

No 依附線上程的Looper中

2.Handler是在主執行緒內?

  不一定 可以通過Looper選擇依附的執行緒

3.Handler的post和sendMessage方法,使用的是一個佇列還是兩個 

  1個

4.子執行緒建立一個Handler,然後sendMessage會怎樣

   報錯

5.Handler中不同的訊息有可能被同時處理嗎?

   不可能 因為他們執行在同一個執行緒中

6.當Handler在處理訊息時,如果收到removeMessage(),會中斷這個處理麼?

  不會