iT邦幫忙

2019 iT 邦幫忙鐵人賽

DAY 26
0

Thread, Handler, Runnable

Runnable

什麼是 Runnable 呢?

我們從官方的文件可以看到 Runnable 是一個 interface 裡面只有一個 run() 的 method 。

所以我們就可以大概猜到 Runnable 就是負責跑程式的。我們可以把我們希望要執行的工作寫在裡面。

Handler

那什麼又是 Handler 呢?

Handler 是負責把接收 Runnable 然後把他傳給 MessageQueue 裡,等待被執行。

當然它也可以把放置的 Runnable 從 MessageQueue 裡抽出來。

Thread

什麼是 Thread 呢?

Thread 就是執行緒,執行緒就是跑我們寫的程式碼的程式。

它會在一個 MessageQueue 裡面拿出需要執行的程式,跑完之後在拿下一個繼續執行。

MessageQueue 裡面需要被執行的程式是以排序方式被放置。方便主執行緒來拿取而不會亂了秩序。

Thread, Handler, Runnable 之間的關係

你也許可以把 Runnable 想成是個可憐的奴隸(?) 被賦予許多工作需要執行。
然後 Handler 是萬惡的人蛇集團(??),控制著 Runnable 讓他去不同的 Thread 裡工作。
掌控它該工作多久,可以休息多少時間。
Thread 你就可以想像成一個工廠,裡面有做不完的工作。可能會有許多人蛇集團提供奴隸,讓 Thread 使用。

範例

我們來看看 ProgressBar 裡面做了什麼吧?

因為我們希望 ProgressBar 每一秒可以增加 10 。

private fun startProgress() {

        runnable = Runnable {
            progressStatus += 10
            progressBar.progress = progressStatus
            handler.postDelayed(runnable, 1000)
        }
        runnable.run()
    }

這裡我們看到 Runnable 裡面定義了 ProgressBar 所需要做的工作後,加入了 handler.postDelayed(runnable, 1000)

代表 1 秒後 handler 會把這個 Runnable 丟進 MainThread 讓 MainThread 去執行。

MainThread 執行 Runnable 裡面又會用 handler postDelayed 一次,這樣就可以形成 Loop 達到我們要的目的。

暫停 ProgressBar

我們想要暫停 ProgressBar 的運作就是要停止 Runnable 繼續進入 MessageQueue。
所以我們就要運用 handler 來把放在 MessageQueue 裡的 Runnable 給叫回來。
這樣就可以達到暫停 ProgressBar 的效果了。

private fun pauseProgress() {
        handler.removeCallbacksAndMessages(null)
    }

今天就先這樣囉,我們明天見~~


上一篇
Day25_MediaPlayer_2
下一篇
Day27_LayoutSwitch
系列文
發現新大陸-Android Kotlin 開發之路30

尚未有邦友留言

立即登入留言