Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> Android開發 >> 關於android開發 >> 階段一:用Handler和Message實現計時效果及其中一些疑問,handlermessage

階段一:用Handler和Message實現計時效果及其中一些疑問,handlermessage

編輯:關於android開發

階段一:用Handler和Message實現計時效果及其中一些疑問,handlermessage


“階段一”是指我第一次系統地學習Android開發。這主要是對我的學習過程作個記錄。

 

本來是打算繼續做天氣預報的優化的,但因為某些原因,我要先把之前做的小應用優化一下。所以今天就插播一下用Handler和Message實現計時效果。

首先,簡要說明一下,這個應用有兩個顯示數字的Text,一個是顯示秒,另一個是顯示毫秒,而每10毫秒發送一次Message,讓顯示毫秒的Text加1,每1000毫秒,也就一秒,就讓顯示秒的Text加1。此外,還有一個自己制作的圓形進度條,每過一秒會增加6度的弧。這個應用有開始、暫停、重置功能。就是下圖這樣子:

一、sendMessage、handleMessage實現跑秒,removeMessages實現暫停

主要流程是下圖這樣的:

說明:

(1)sendMessage都是延遲發送,也就是sendMessageDelayed。

(2)invalidate是刷新視圖,用來刷新上面提到的圓形進度條。

詳細來講,就是單擊開始按鈕,發送第一個Message,然後傳到handleMessage中處理,之後便在handleMessage中循環發送Message並處理。而當點擊暫停按鈕時,就會清除掉消息隊列中的消息,也就打破了循環。

接下來,詳細講講Message的處理流程這部分,如下圖:

 

說明:

(1)當有message發送來時,並不會直接添加到MessageQueue中,它需要Looper和Handler對象一起作用,才會添加進去。另外,MessageQueue中的Message是由Looper派遣出去的。

(2)根據(1)知道,要處理message,必須要有Looper。所以在其它線程執行handleMessage時,必須要創建Looper。因為除了主線程默認有Looper之外,其它線程都是沒有的。而每一個Handler實例都會和一個線程和這個線程的MessageQueue關聯起來。

(3)當要在handleMessage裡面發送message時,是通過Message.obtain方法獲取message對象,這方法是從一個叫公共信息池的地方獲取對象的,我的感覺是,這裡的對象就是接收到的message。

(4)在上一張圖中,暫停就是調用removeMessages方法。移除掉的就是在MessageQueue中的message。

我想講的主要就是上面的那些,以下是開始的那個流程圖的代碼,:

效果圖,只能是靜態的:

二、一些疑問

(1)這裡的Handler是一個靜態類,老師提倡這麼寫。我之前是這樣寫的:

但其實,這麼寫Android Studio已經有提示了

我能理解到的就是,如果在主線程中Handler使用Looper或者MessageQueue時,就需要聲明Handler為靜態類,還有要用上WeakReference弱引用,這麼做是為了便於回收。具體是怎樣的,還需深入學習。

(2)用new傳入Context的方法創建CircularView(自定義View)的對象,能調用CircularView類的公有方法並修改了其中的成員變量,但就是不能成功調用invalidate刷新方法。

構造方法是按老師教的修改,但老師並沒有演示這樣做。構造方法如下圖:

通過打Log輸出(圖沒貼上來),可以知道的確成功調用了自定義View類CircularView中的方法。

但當我通過findViewById的方法來創建對象時,不僅能調用CircularView類的公有方法並修改了其中的成員變量,還能成功調用invalidate方法。

對此,我就輸出它們倆的對象,看一下,如下圖:

這是通過findViewById的方法來創建的

這是通過new傳入Context方法創建的

發現它們創建的對象原來是不一樣的。我也只能研究到這一步了,所以要深入學習的還有很多啊!

 

  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved