Androidの非同期処理をKotlinを用いてなるべく簡単に実装する方法を紹介します。一見難しそうな非同期処理ですが、単純に非同期な処理を実行するだけなら単純です。
Androidの非同期処理に必要なもの(Kotlin)
ExecutorServiceインスタンスとRunnableを実装したクラスがポイントとなります。
ExecutorServiceのsubmitメソッドを実行すると、非同期処理が実行されます。
サンプルコード
以下仕様のサンプルを作成。
- ボタン1を押すとログ(★)が出力される。
- ボタン2を押すとカウンタが開始し、カウントされるたびにログ(〇)が出力される(非同期で実行)
ボタン2を押した後、好きなタイミングでボタン1を押すと「ボタン1のログ」も出力されます。
2つのログが混ざって出力されるので非同期処理が実行できていることが確認できます。
XML
ボタンを2つ配置しています。
(本サンプルではイベントの起点としてボタン使っているだけで非同期処理とは直接関係ないです)
<LinearLayout> <Button android:id="@+id/btn1" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center" android:text="ログ出力" /> <Button android:id="@+id/btn2" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center" android:text="カウント開始" /> </LinearLayout>
Kotlin
ボタン2(id:btn2)の処理の部分が非同期処理開始のトリガーとなっています。
class MainActivity : AppCompatActivity() { private lateinit var binding : ActivityMainBinding override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) //setContentView(R.layout.activity_main) binding = ActivityMainBinding.inflate(layoutInflater) val view = binding.root setContentView(view) //クリックリスナのインスタンス生成 val sampleListener = SampleListener() //ボタンにリスナ追加 binding.btn1.setOnClickListener(sampleListener) binding.btn2.setOnClickListener(sampleListener) } //リスナクラス private inner class SampleListener : View.OnClickListener{ override fun onClick(v: View) { when(v.id){ // 手動でログ出力 binding.btn1.id ->{ Log.d("test", "★Button1 Pushed !!") } // 非同期(バックグラウンド)でカウントしログ出力 binding.btn2.id ->{ // Runnableインターフェースを実装したクラスのインスタンスを生成 val asyncCounter = AsyncCounter() // 別スレッドで動作するExecuteServiceインスタンスを生成する val executeService = Executors.newSingleThreadExecutor() // 非同期処理の実行 executeService.submit(asyncCounter) } } } } // インターフェースRunnableを実装したクラス private inner class AsyncCounter():Runnable{ // ここが非同期(別スレッド)で実行される override fun run(){ // 10回ループ中(都度ログを出力する) repeat(10){ Log.d("test", "〇AsyncCount:" + it.toString()) // 1000ms待つ Thread.sleep(1000) } } } }
さいごに
簡単に非同期処理ができました。続編として引数・返値のあるもの、UIの更新を行うものを考えています。
コメント