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