Kotlinでスレッド処理【Androidアプリ開発】

Kotlinでスレッド処理【Androidアプリ開発】

KotlinのThreadクラスで、スレッドの作成とキャンセル処理を試してみた。この記事ではThreadの使い方を解説していく。

スレッド処理プロジェクトの全体の内容

スレッド動作のGIFアニメ
スレッド動作のGIFアニメ

この画像のように、Startボタンを押すとスレッドを新規作成して処理を走らせる。スレッドで行う処理は、1秒間隔でカウンタを1づつ上げそれを標準出力している。そして、Stopボタンを押すことでスレッドがキャンセルされる仕組みになっている。MainActivityクラスは次のようにプログラミングした。

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の作成

スレッドの新規作成とそのスレッドをスタートさせる基本的な形は次のようになる。

mWorker = Thread { 
	...
	//処理内容
}
mWorker.start()

Treadをキャンセルさせる

スレッドをキャンセルさせたい場合はinterrupt()メソッドで行う。

mWorker?.interrupt()

しかし、このままだとスレッド処理内で例外が投げられクラッシュしてしまうだろう。そこでスレッド内の処理をtry-catchで囲んで上げる必要がある。さらにcatch内ではThread.currentThread().interrupt()を再び実行することで、安全で確実なスレッドのキャンセルができる。

try {
	...
	//処理内容
} catch (ex: InterruptedException) {
	Thread.currentThread().interrupt()
}

AtomicBoolean

AtomicBooleanは、複数スレッドから安全に同時アクセスできるboolean型である。ここではカウンターはInt型になっているが、厳密にはAtomicIntegerを利用すべきなのかもしれない。

参考

▼ こんな記事も書いてます。

「キッチンノート.fun」という料理サイトを立ち上げました!このサイトで紹介していた料理記事は、そちらへ移動しました。
記事に関するご質問などがあれば、
Twitter または お問い合わせ までご連絡ください。
関連記事