Kotlin の coroutines + Android で簡単なカウントダウンタイマー

環境

Kotlin の coroutines 環境セットアップ

ググっても、Kotlinのバージョンによって差がありそうだったので素直に公式を見る。

github.com

私の手元では、↓2つのファイルに手を加えればOK

build.gradle (Module)

dependencied {
    ...
    def kotlin_coroutines_version='0.16'
    implementation "org.jetbrains.kotlinx:kotlinx-coroutines-core:$kotlin_coroutines_version"
    implementation "org.jetbrains.kotlinx:kotlinx-coroutines-android:$kotlin_coroutines_version"
    ...
}

gradle.properties

kotlin.coroutines=enable

coroutine を使う

非同期処理自体はこんな感じ。 launch は kotlinx.coroutines.experimental.launch UI は kotlinx.coroutines.experimental.android.UI delay は kotlinx.coroutines.experimental.delay kotlinで全て完結する。

launch(UI) {
   while(isActive) {
        delay(1000)
        time--
    }
}

launch の戻り値は kotlinx.coroutines.experimental.Job で、 start()stop() といったいかにもなメソッドを持ってる。 なので、それをプロパティにもたせて、

class Timer(time: Int) {
    private var countDownJob: Job? = null

    fun countDownStart() {
        if (countDownJob != null) { return }
        countDownJob = launch(UI) {
            while(isActive) {
                delay(1000)
                time--
            }
        }
        countDownJob?.start()
    }

    fun countDownStop() {
        countDownJob?.cancel()
        countDownJob = null
    }
}

といった感じにすれば、カウントダウンタイマーの処理部分ができあがる。 *1

*1:毎回 launch してるのが無駄な気がする。