Androidプログラミング

【Android】最も簡単な非同期処理【Kotlin】

Androidの非同期処理記事のアイキャッチ画像 Android

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の更新を行うものを考えています。

コメント

タイトルとURLをコピーしました