Kotlinでスレッド処理【Androidアプリ開発】
KotlinのThreadクラスで、スレッドの作成とキャンセル処理を試してみた。この記事ではThreadの使い方を解説していく。
スレッド処理プロジェクトの全体の内容
この画像のように、Startボタンを押すとスレッドを新規作成して処理を走らせる。スレッドで行う処理は、1秒間隔でカウンタを1づつ上げそれを標準出力している。そして、Stopボタンを押すことでスレッドがキャンセルされる仕組みになっている。MainActivityクラスは次のようにプログラミングした。
kotlin
class MainActivity : AppCompatActivity() {
var mWorker: Thread? = null
var running = AtomicBoolean(false)
var counter:Int = 0
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
findViewById<Button>(R.id.start).setOnClickListener {
runWorker()
}
findViewById<Button>(R.id.stop).setOnClickListener {
interruptWorker()
}
}
fun runWorker() {
running.set(true)
mWorker = Thread {
while (running.get()) {
try {
Thread.sleep(1000)
counter++
println("counter $counter")
} catch (ex: InterruptedException) {
Thread.currentThread().interrupt()
println("Thread was interrupted, Failed to complete operation")
}
}
}
mWorker?.start()
}
fun interruptWorker() {
running.set(false)
mWorker?.interrupt()
}
}
Treadの作成
スレッドの新規作成とそのスレッドをスタートさせる基本的な形は次のようになる。
kotlin
mWorker = Thread {
...
//処理内容
}
mWorker.start()
Treadをキャンセルさせる
スレッドをキャンセルさせたい場合はinterrupt()メソッドで行う。
kotlin
mWorker?.interrupt()
しかし、このままだとスレッド処理内で例外が投げられクラッシュしてしまうだろう。そこでスレッド内の処理をtry-catchで囲んで上げる必要がある。さらにcatch内ではThread.currentThread().interrupt()を再び実行することで、安全で確実なスレッドのキャンセルができる。
kotlin
try {
...
//処理内容
} catch (ex: InterruptedException) {
Thread.currentThread().interrupt()
}
AtomicBoolean
AtomicBooleanは、複数スレッドから安全に同時アクセスできるboolean型である。ここではカウンターはInt型になっているが、厳密にはAtomicIntegerを利用すべきなのかもしれない。
参考
How to Kill a Java Thread | Baeldung Create thread - Android - Kotlin Discussions java - クラス AtomicBooleanについて。 - スタック・オーバーフロー
▼ こんな記事も書いてます。
関連記事
アイデアノート > ネイティブアプリ開発