スレッド処理 (Android Kotlin)

/


KotlinでThreadクラスでのスレッドの作成とキャンセル処理を試してみた。




サンプルプロジェクトの全体の内容




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

MainActivityクラスは次のようにプログラミングした。




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を利用すべきなのかもしれない。



参考


* How to Kill a Java Thread
* Create thread (Kotlin)
* クラス AtomicBooleanについて。(stack overflow)


関連記事


非同期 & ネットワーク処理
* はじめてRetrofitを使ってみる (Android Kotlin)
* 非同期処理でCoroutine(コルーチン)を使ってみる (Android Kotlin)
* OkHttpでHTTP通信 (Android Kotlin)
* スレッド処理 (Android Kotlin)

View & レイアウト
* リサイクラービューを使ってリスト表示 (Android Kotlin)
* 角丸表現 (Android Kotlin)
* onSaveInstanceStateで画面回転時の状態の保存と復元 (Android Kotlin)
* ListViewを簡単なモデルで理解しよう (Android Kotlin)
* バネアニメーション (Android Kotlin)
* startActivityForResultを使ってみる (Android Kotlin)
* ActivityとFragmentの連携を理解する (Android Kotlin)
* DataBinding機能を使ってみる (Android Kotlin)
* タッチイベントのフック (Android Kotlin)
* DialogFragmentを使ったダイアログの表示 (Android Kotlin)

サウンド
* これってSoundPoolのバグ?(Android Kotlin)
* SoundPoolを使ってゲームの効果音を再生する (Android Kotlin)

データ & オブジェクト
* Kotlinでオブジェクト(object)の動作確認
*
データクラスとタプル (Android Kotlin)
* Null安全、ぬるぽバイバイ (Android Kotlin)