Android-handler

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的更新,實現每隔一秒改變數字,完成一個計時的簡單功能


下面是全部代碼:


?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。