android.os.handler

android.os.handler相關知識整理

Handler在android裏負責發送和處理消息。它的主要用途有:

  1)按計劃發送消息或執行某個Runnanble(使用POST方法);
  2)從其他線程中發送來的消息放入消息隊列中,避免線程衝突(常見於更新UI線程)/用來向不屬於自己的線程的隊列中加入某個動作

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)。

      當應用程序啓動時,Android首先會開啓一個主線程(也就是UI線程),主線程爲管理界面中的UI控件,進行事件分發,比如說,你要是點擊一個Button,Android會分發事件到Button上,來響應你的操作。  如果此時需要一個耗時的操作,例如:聯網讀取數據,或者讀取本地較大的一個文件的時候,你不能把這些操作放在主線程中,,如果你放在主線程中的話,界面會出現假死現象,如果5秒鐘還沒有完成的話,會收到Android系統的一個錯誤提示  "強制關閉", 這個時候我們需要把這些耗時的操作,放在一個子線程中,因爲子線程涉及到UI更新,Android主線程是線程不安全的,也就是說,更新UI只能在主線程中更新,子線程中操作是危險的.這個時候,由於Handler運行在主線程中(UI線程中),  它與子線程可以通過Message對象來傳遞數據,這個時候,Handler就承擔着接受子線程傳過來的Message對象(裏面包含數據)  ,把這些消息放入主線程隊列中,配合主線程進行更新UI

發佈了4 篇原創文章 · 獲贊 3 · 訪問量 3萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章