這次通過 Handler 來定時增加 progressBar 的進度,iOS 中可以利用 Timer 來達成。
- 提供三個按鈕來操作進度、一個 TextView 顯示進度文字。
- Start – 每 500 毫秒增加進度 10
- Pause – 暫停任務
- Stop – 停止任務並且將進度改為 0
- 執行任務過程中如果發現進度超過最大值,則停止任務。
ProgressControl
Thread
和 iOS 一樣,在 App 啟動後,系統會建立一個進程,這個進程裡面會有一個主線程,也就是 UI 線程。
所以和開發 iOS 的過程一樣,當使用多線程處理數據並且要更新 UI 的時候,要記得回到主線程上。
Handler & Runnable
我們可以通過 Handler 搭配 Runnable 來達到可以重複執行任務的功能。
Handler
Handler 會讓我想到 iOS 中的 Dispatch 可以執行任務和建立隊列。
- handleMessage(Message) – 對接受到的消息進行處理
- post(Runnable) – Runnable – 對象入隊
- postAtTime(Runnable, long) – 指定時間入隊
- postDelayed(Runnable, long) – 延長指定的時間入隊
- sendEmptyMessage(Int) – 發送只有標示(int) 的信息
- sendMessage(Message) – 發送信息
- sendMessageAtTime(Message, long) – 在指定時間發送信息
- sendMessageDelayed(Message, long) – 延長指定的時間發送消息
Runnable 是一個抽象類,提供一個 run() 方法,用來執行任務。
1 2 3 4 5 6 |
private var runnable = object:Runnable{ override fun run() { startIncreaseProgress() } } |
準備 taskHandler
1 |
private var taskHandler = Handler() |
通過 postDelayed(Runnable r, long delayMillis) 來開始一個任務,需要提供 runnable 以及執行間隔時間(毫秒)
1 2 |
// start task taskHandler.postDelayed(runnable, repeatTaskTime) |
removeCallbacksAndMessages(Object token) 用來取消任務
1 2 |
// cancle task taskHandler.removeCallbacksAndMessages(null) |
筆記
- 研究:Handler / Message / MessageQueue / Looper 會在之後的動手做中專門練習一下。
參考
- 官方文件 – Handler
- 官方文件 – ProgressBar
- 可以到 Github 上看對應的 Source Code