Android application development 第20章:非同期処理(Handler / AsyncTask / Coroutineの比較)

🕰 そもそも「非同期処理」って?

Androidでは、**UIスレッド(メインスレッド)**は非常に重要です。
このスレッドは画面描画やタッチイベントの処理を担っています。

重たい処理(ネットワーク通信やDBアクセスなど)をUIスレッドで実行すると、アプリが固まり「ANR(Application Not Responding)」が発生します。

そのため、UIスレッドとは別のスレッドで処理する=非同期処理が必要になります。


🧱 比較表:主要な非同期処理の手法

手法特徴使用可否備考
Handlerメインスレッドと他スレッド間でメッセージ送受信。シンプルで低レベル。◎(現在も使える)古典的。理解は重要。
AsyncTaskバックグラウンド処理とUI更新のセット。簡単に使えるが非推奨。×(API30で非推奨)今後は使わない方向。
Coroutine(Kotlin)軽量スレッド。構文がシンプルで非同期を直感的に書ける。◎(主流)Javaでは使いにくい。Kotlin前提。

🧵 Handler の使い方(Java標準的)

HandlerLooper を使ってスレッド間でメッセージやRunnableを処理する基本クラスです。

Handler handler = new Handler(Looper.getMainLooper());

new Thread(() -> {
    // 重たい処理
    String result = doHeavyTask();

    // UIスレッドに結果を返す
    handler.post(() -> {
        textView.setText(result);
    });
}).start();

📌 handler.post() を使えば、メインスレッド上で安全にUI更新ができます。


AsyncTask(現在は非推奨)

一昔前までは以下のように書けました:

new AsyncTask<Void, Void, String>() {
    @Override
    protected String doInBackground(Void... voids) {
        return doHeavyTask();
    }

    @Override
    protected void onPostExecute(String result) {
        textView.setText(result);
    }
}.execute();

ですが、ライフサイクルの扱いが難しくバグの温床になるため、APIレベル30以降で非推奨となりました。今から学ぶ必要はありません。


🚀 Coroutine(Kotlin)

もし将来、Kotlinで書くことになれば、非同期処理は Coroutine が圧倒的に便利です。

lifecycleScope.launch {
    val result = withContext(Dispatchers.IO) {
        doHeavyTask()
    }
    textView.text = result
}

✅ 明示的にスレッドを切り替える必要がなく、直感的なコードで非同期処理が書けます。
※ Javaエンジニアから見ると「async/await」に近い書き心地です。


🤔 Javaエンジニアとして覚えておくべきこと

ポイント説明
Handler は基本なので知っておいて損なしスレッドとメッセージ処理の基礎になる
AsyncTask はもう使わない過去のコードで見かけたら注意して読む
Kotlinが主流ならCoroutineを検討Javaで非同期をシンプルに書きたいならKotlin移行も視野に

🧭 まとめ

  • UIスレッドは極力軽く保つことが重要。
  • 古典的:Handler(=低レベルだが柔軟)
  • 非推奨:AsyncTask(簡単だが問題あり)
  • これからの主流:Kotlin + Coroutine

mh

Related Posts

Android application development 第19章:JSONパース(Gson)

🧾 Gsonとは? Gson(GoogleのJSONライブラ…

Android application development 第18章:Retrofitを使ったAPI通信

🌐 Retrofitとは? Retrofit は、HTTP通…

You Missed

Kubernetes Learning 第16章:外部アクセスとDNS、LoadBalancerのしくみ

  • 投稿者 mh
  • 5月 20, 2025
  • 7 views

Android application development 第20章:非同期処理(Handler / AsyncTask / Coroutineの比較)

  • 投稿者 mh
  • 5月 20, 2025
  • 8 views

Kubernetes Learning 第15章:ServiceとIngressを使った公開

  • 投稿者 mh
  • 5月 19, 2025
  • 17 views

Android application development 第19章:JSONパース(Gson)

  • 投稿者 mh
  • 5月 19, 2025
  • 16 views

Kubernetes Learning 第14章:Webアプリケーションの例 〜Spring Boot + MySQLをKubernetesに載せてみる〜

  • 投稿者 mh
  • 5月 18, 2025
  • 23 views

Android application development 第18章:Retrofitを使ったAPI通信

  • 投稿者 mh
  • 5月 18, 2025
  • 18 views