天天看點

android handler

引用:http://www.cnblogs.com/keyindex/articles/1822463.html

前言

  學習android一段時間了,為了進一步了解android的應用是如何設計開發的,決定詳細研究幾個開源的android應用。從一些開源應用中吸收點東西,一邊進行量的積累,一邊探索android的學習研究方向。這裡我首先選擇了jwood的 Standup Timer 項目。本文将把研究的内容筆記整理,建立一個索引清單。

關鍵詞

  Android.os.Handler涉及較多的知識點,我把一些關鍵詞列舉在下面,将主要介紹Handler:

  •   android.os.Handler 、 android.os.Handler.Callback
  •   Looper、
  •   Threadle、Runnable
  •   Message、Message queue

android.os.Handler

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

  1)按計劃發送消息或執行某個Runnanble(使用POST方法);

  2)從其他線程中發送來的消息放入消息隊列中,避免線程沖突(常見于更新UI線程)

   預設情況下,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)。

倒計時程式

  利用Timer 編寫一個倒計時程式,程式使用Timer和TimerTask來完成倒計時,同時使用sendMessages方法發送消息,然後在HanleMessage裡更新UI。

Activity布局:

android handler

Layout

這裡使用TextView 來顯示倒計時的時間變化,兩個按鈕用于控制時間的開始和停止。SeekBar主要是用于檢視線程是否被阻塞(阻塞時無法拖動)。

android handler

onCreate

在onCreate方法中初始化元素個元素,myHandler = new Handler(this); 調用的是  Handler(Handler.Callback callback)構造函數,在回調方法callback中對發送來的消息進行處理(這樣我們就不必使用内部類的寫法來 重寫HandleMessage()方法了),是以Activity必須實作 android.os.Handler.Callback 接口。我們還在将onCreate 方法的ThreadId 記錄在了Log中用以和消息發送、處理時所作的線程進行比較。

android handler

發送消息

實作Button按鈕的事件處理以此進入倒計時操作。這裡使用的Timer 來執行定時操作(其實我們完全可以另起一個線程)。Task類繼承了TimerTask類,裡面增加了一個任務處理接口來實作回調模式,應此Activity需要實作該回調的接口 ITaskCallBack(這樣做是因為我比較不喜歡内部類的編寫方法)。

android handler

ICallBack接口和Task類

這是Java的回調函數的一般寫法。

android handler

實作CallBack

  可以看到 實作 android.os.Handler.Callback 接口,其實就是對handleMessage()方法進行重寫(和内部類的一個差別是,内部類的傳回值是Void)。

運作結果

android handler

  可以看到在onCreate 方法中線程的ID是1(UI線程) 這與 HandlerMessage 進行消息處理時是所作的線程ID是一樣的,而消息發送的線程ID則為8非UI線程。

使用Threadle進行實作

android handler

Activity類

android handler

自定義的線程類

這裡繼承了Thread類,也可以直接實作 Runnable接口。

關于POST

  Post的各種方法是把一個Runnable發送給消息隊列,它将在到達時進行處理。

android handler

POST

使用POST的方式 是将Runnable 一起發送給處理的線程(這裡為UI),如果Runnable的操作比較耗時的話那線程将進入阻塞狀态。可以看到先運作 Runnable的Run方法 然後在進入 HandleMessage() 。我還嘗試了另一種寫法,将TimerThreadPOST過去,運作結果是一樣的。

android handler

代碼

可以說POST的各種方法主要是用于 “按計劃發送消息或執行某個Runnanble(使用POST方法)”。

參考文獻

  android學習筆記之消息機制,異步和多線程

  android handler概念解釋

  SDK

系列索引

  

Android 開源項目-StandupTimer學習筆記索引