特點
1. 傳遞Message。用於接受子執行緒傳送的數據, 並用此數據配合主執行緒更新UI。
在Android中,對於UI的操作通常需要放在主執行緒中進行操作。如果在子執行緒中有關於UI的操作,那么就需要把數據訊息作為一個Message對象傳送到訊息佇列中,然後,由Handler中的handlerMessage方法處理傳過來的數據信息,並操作UI。當然,Handler對象是在主執行緒中初始化的,因為它需要綁定在主執行緒的訊息佇列中。
類sendMessage(Message msg)方法實現傳送訊息的操作。 在初始化Handler對象時重寫的handleMessage方法來接收Message並進行相關操作。
2. 傳遞Runnable對象。用於通過Handler綁定的訊息佇列,安排不同操作的執行順序。
Handler對象在進行初始化的時候,會默認的自動綁定訊息佇列。利用類post方法,可以將Runnable對象傳送到訊息佇列中,按照佇列的機制按順序執行不同的Runnable對象中的run方法。
分發訊息方法
post(Runnable)
postAtTime(Runnable,long)
postDelayed(Runnable,long)
sendEmptyMessage(int)
sendMessage(Message)
sendMessageAtTime(Message,long)
sendMessageDelayed(Message,long)
和多執行緒
post方法雖然傳送的是一個實現了Runnable接口的類對象,但是它並非創建了一個新執行緒,而是執行了該對象中的run方法。也就是說,整個run中的操作和主執行緒處於同一個執行緒。
這樣對於那些簡單的操作,似乎並不會影響。但是對於耗時較長的操作,當它被加入到訊息佇列中之後執行會占用很長的時間,以至於處於同一執行緒的其他操作無法繼續執行,就會出現“假死”。為了解決這個問題,就需要使得handler綁定到一個新開啟執行緒的訊息佇列上,在這個處於另外執行緒的上的訊息佇列中處理傳過來的Runnable對象和訊息。
這樣,當使用sendMessage方法傳遞訊息或者使用post方法傳遞Runnable對象時,就會把它們傳遞到與handler對象綁定的處於另外一個執行緒的訊息佇列中,它們將在另外的訊息佇列中被處理。而主執行緒還會在傳送操作完成時候繼續進行,不會影響當前的操作。
這裡需要注意,這裡用到的多執行緒並非由Runnable對象開啟的,而是ThreadHandler對象開啟的。Runnable對象只是作為一個封裝了操作的對象被傳遞,並未產生新執行緒。