Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> 關於Android編程 >> Handler機制

Handler機制

編輯:關於Android編程

一、Handler的定義:    Handler主要用於接收子線程發送過來的數據, 並用此數據配合主線程進行UI的更新。    當應用程序啟動時,Android首先會開啟一個主線程 (UI線程),主線程主要為管理界面中的UI控件,進行事件的分發,好比如,你要點擊一個 Button控件,Android就會通過此Buttond的監聽器分發事件到此Button上,以此來響應你的操作。如果此時是一個需要耗時長的操作,例如:聯網讀取數據,或者讀取本地較大的一個文件的時候,就不能把這些操作放在主線程當中了,如果被放在主線程中的話,界面會出現假死現象,如果5秒鐘還沒有完成的話,會收到Android系統的一個錯誤提示“強制關閉”。這個時候就需要把這些耗時的操作,放在一個子線程當中了,因為子線程可能會涉及到UI的更新,當新線程中有涉及到操作UI的操作時,就會對主線程產生危險,因此,Android提供了Handler作為主線程和子線程的紐帶。也就是說,更新UI只能在主線程當中進行更新,在子線程中操作是危險的。    由於Handler是運行在主線程當中(UI線程中),它與子線程主要是通過Message對象來傳遞數據,這個時候,Handler就承擔著接收子線程傳過來的(子線程用sedMessage()方法傳遞)Message對象(裡面包含數據),把這些消息放入主線程隊列中,配合主線程進行更新UI。    注意:Handler 對象初始化後,就默認與對它初始化的進程的消息隊列綁定,因此可以利用Handler所包含的消息隊列,制定一些操作的順序。   二、Handler的主要作用 1. 傳遞Message,用於接收子線程發送過來的數據, 並用此數據配合主線程更新UI。     在Android中,對於UI的操作通常需要放在主線程中進行操作。如果在子線程中有關於UI的操作,那麼就需要把數據消息作為一個Message對象發送到消息隊列中,然後,由Handler中的handlerMessge()方法處理傳過來的數據信息,並操作UI。當然,Handler對象是在主線程中初始化的,它需要綁定在主線程的消息隊列中。     類sendMessage(Message msg)方法實現發送消息的操作。在初始化Handler對象時重寫的handleMessage()方法是用來來接收Messgae並進行相關操作的。 2. 傳遞Runnable對象,用於通過Handler綁定的消息隊列,安排不同操作的執行順序。     Handler對象在進行初始化的時候,會默認的自動綁定消息隊列。利用類post方法,可以將Runnable對象發送到消息隊列中,按照隊列的機制按順序執行不同的Runnable對象中的run方法。 三、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)。
  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved