Android:Handler學習總結

有那些方法加入到主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(),會中斷這個處理麼?

  不會

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章