Kotlin の coroutines + Android で簡単なカウントダウンタイマー
環境
- Android
- Android Studio 3.0.0-alpha4
- compileSdk 25
- minSdk 19
- Kotlin 1.1.2-5
- coroutines 0.16
Kotlin の coroutines 環境セットアップ
ググっても、Kotlinのバージョンによって差がありそうだったので素直に公式を見る。
私の手元では、↓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 してるのが無駄な気がする。