Handler機制

1、Handler的定義:web

   Handler主要用於接收子線程發送過來的數據, 並用此數據配合主線程進行UI的更新。併發

   當應用程序啓動時,Android首先會開啓一個主線程 (UI線程),主線程主要爲管理界面中的UI控件,進行事件的分發,比如如,你要點擊一個 Button控件,Android就會經過此Buttond的監聽器分發事件到此Button上,以此來響應你的操做。若是此時是一個須要耗時長的操做,例如:聯網讀取數據,或者讀取本地較大的一個文件的時候,就不能把這些操做放在主線程當中了,若是被放在主線程中的話,界面會出現假死現象,若是5秒鐘尚未完成的話,會收到Android系統的一個錯誤提示「強制關閉」。這個時候就須要把這些耗時的操做,放在一個子線程當中了,由於子線程可能會涉及到UI的更新,當新線程中有涉及到操做UI的操做時,就會對主線程產生危險,所以,Android提供了Handler做爲主線程和子線程的紐帶。也就是說,更新UI只能在主線程當中進行更新,在子線程中操做是危險的。oop

   因爲Handler是運行在主線程當中(UI線程中),它與子線程主要是經過Message對象來傳遞數據,這個時候,Handler就承擔着接收子線程傳過來的(子線程用sedMessage()方法傳遞)Message對象(裏面包含數據),把這些消息放入主線程隊列中,配合主線程進行更新UI。post

   注意:Handler 對象初始化後,就默認與對它初始化的進程的消息隊列綁定,所以能夠利用Handler所包含的消息隊列,制定一些操做的順序。spa

 

2、Handler的主要做用線程

1. 傳遞Message,用於接收子線程發送過來的數據, 並用此數據配合主線程更新UI。指針

    在Android中,對於UI的操做一般須要放在主線程中進行操做。若是在子線程中有關於UI的操做,那麼就須要把數據消息做爲一個Message對象發送到消息隊列中,而後,由Handler中的handlerMessge()方法處理傳過來的數據信息,並操做UI。固然,Handler對象是在主線程中初始化的,它須要綁定在主線程的消息隊列中。orm

    類sendMessage(Message msg)方法實現發送消息的操做。在初始化Handler對象時重寫的handleMessage()方法是用來來接收Messgae並進行相關操做的。對象

2. 傳遞Runnable對象,用於經過Handler綁定的消息隊列,安排不一樣操做的執行順序。隊列

    Handler對象在進行初始化的時候,會默認的自動綁定消息隊列。利用類post方法,能夠將Runnable對象發送到消息隊列中,按照隊列的機制按順序執行不一樣的Runnable對象中的run方法。

3、Handler的一些特色

handler能夠分發Message對象或Runnable對象到主線程中,每一個Handler實例,都會被綁定到建立它的線程中(通常是位於主線程)。

      

Handler中分發消息的一些方法:

post(Runnable)

postAtTime(Runnable,long)

postDelayed(Runnable long)

sendEmptyMessage(int)

sendMessage(Message)

sendMessageAtTime(Message,long)

sendMessageDelayed(Message,long)

以上post類方法容許你排列一個Runnable對象到主線程隊列當中;

sendMessage類方法,容許你安排一個帶數據的Message對象到隊列中。

注意:

   默認狀況下,Handler接受的是當前線程下的消息循環實例(使用Handler(Looper looper)、Handler(Looper looper, Handler.Callback callback) 能夠指定線程),同時一個消息隊列能夠被當前線程中的多個對象進行分發、處理(在UI線程中,系統已經有一個Activity來處理了,你能夠再起若干個 Handler來處理)。在實例化Handler的時候,Looper能夠是任意線程的,只要有Handler的指針,任何線程也均可以 sendMessage。Handler對於Message的處理不是併發的。一個Looper 只有處理完一條Message纔會讀取下一條,因此消息的處理是阻塞形式的(handleMessage()方法裏不該該有耗時操做,能夠將耗時操做放在 其餘線程執行,操做完後發送Message(經過sendMessges方法),而後由handleMessage()更新UI)。

相關文章
相關標籤/搜索