🕰 そもそも「非同期処理」って?
Androidでは、**UIスレッド(メインスレッド)**は非常に重要です。
このスレッドは画面描画やタッチイベントの処理を担っています。
重たい処理(ネットワーク通信やDBアクセスなど)をUIスレッドで実行すると、アプリが固まり「ANR(Application Not Responding)」が発生します。
そのため、UIスレッドとは別のスレッドで処理する=非同期処理が必要になります。
🧱 比較表:主要な非同期処理の手法
手法 | 特徴 | 使用可否 | 備考 |
---|---|---|---|
Handler | メインスレッドと他スレッド間でメッセージ送受信。シンプルで低レベル。 | ◎(現在も使える) | 古典的。理解は重要。 |
AsyncTask | バックグラウンド処理とUI更新のセット。簡単に使えるが非推奨。 | ×(API30で非推奨) | 今後は使わない方向。 |
Coroutine (Kotlin) | 軽量スレッド。構文がシンプルで非同期を直感的に書ける。 | ◎(主流) | Javaでは使いにくい。Kotlin前提。 |
🧵 Handler
の使い方(Java標準的)
Handler
は Looper
を使ってスレッド間でメッセージや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