1.什么是handler?
定義
Handler是用來結合線程的消息隊列來發送、處理"Message對象"和"Runnable對象"的工具。
每一個Handler實例之后會關聯一個線程和該線程的消息隊列。也就是說,當你創建一個Handler的時候,從此開始,他就會自動關聯到所在的線程/消息隊列,然后它就會陸續把Message/Runnable分發到消息隊列,并在他們出隊的時候處理掉。因為android只允許在主線程中更新UI,Handler的目的就是作為線程通信的橋梁,進而再通過主線程更新UI。使用Handler這種異步回調機制,使我們可以再完成一個很長的任務后再做出相應的通知。
2.Handler和Message、MessageQueue、Looper之間的關系
Message
Handler接收與處理的消息對象
MessageQueue
消息隊列,以先進先出隊列形式管理所有的Message,且在初始化Looper對象時會創建一個與之關聯的MessageQueue。每個線程最多只有一個MessageQueue。MessageQueue通常都是由Looper來管理,而主線程創建時,會創建一個默認的Looper對象,而Looper對象的創建,將自動創建一個MessageQueue。其他非主線程,不會自動創建Looper。
Looper
每個線程只能夠一個Looper,管理MessageQueue,不斷從中去除Message分發給對應的Handler處理。
通俗一點講:當我們的子線程想修改Activity中的UI組件時,我們可以新建一個Handler對象,通過這個對象向主線程發送消息;而我們發送的消息會先到主線程的MessageQueue中進行等待,由Looper按先入先出順序取出,再根據Message對象的what屬性分發給對應的Handler進行處理。
3.為什么使用handler,MessageQueue,Looper?
主線程無法進行時間比較繁長的任務,所以需要子線程進行處理,然而子線程無法進行UI的界面更新,所以我們需要使用handler來傳遞消息給主線程,讓其完成UI的更新。由于主線程和子線程進行不同的時間工作,所要需要用MessageQueue來存放子線程的消息,Looper取出消息交給主線程響應。
4.使用handler的主要步驟
主要步驟分為三布:
1.首先創建好handler.
從子線程中發出消息
在handler中捕獲所需消息,實現響應
5.Message的對象
what屬性:
int類型,主線程用來識別子線程發來的是什么消息。
arg1屬性:
int類型,如果傳遞的消息類型為int型,可以將數字賦給arg1,arg2。
obj屬性:
Objectt類型,如果傳遞的消息是String或者其他,可以賦給obj。
6.使用Handler和線程制作簡單的計時器
首先創建好Activity并完善好Activity的布局文件,做好響應的控件和ID
在Activity中綁定好我們所創的控件Id ,為了實現按鈕點擊開始計時,我們還需要設置按鈕的監聽。
時間倒計時我們需要用子線程來通過Handler來傳遞時間的變化,主線程獲取響應,所以要先創建好Handler
設置好監聽事件,我們需要從EditText中獲取所要設定的時間,所以創建int型來獲取存放用戶所輸入的數字,將顯示的Textview設置為倒計時+數字,利用for循環來改變數字,并創建一個新子線程來實現讀秒,讓子線程睡上一秒后發送新的信息。
之后再主線程中捕獲消息,響應設置TextView的更新,實現每隔一秒改變數字,完成一個計時的簡單功能
下面是全部代碼: