Handler原理解析と実践: HandlerThread
HandlerThreadはLooperを持つスレッドクラスで、スレッドクラスを継承しRunnableインターフェイスを実装している。HandlerThreadクラスを使うことで、容易にバックグラウンドスレッドで時間のかかる処理を実行することができ、必要な時にハンドラーを使ってメインスレッドと通信することができる。
ハンドラー·スレッドのしくみを以下で説明します。
- HandlerThread のコンストラクタでは、Looper が作成され、現在スレッドの Looper オブジェクトがメンバ変数 mLooper に保持されます。
- HandlerThread内のrunメソッドで、Looperのloopメソッドを呼び出してLooperを処理しつつまわす。
- Looperのloopメソッドでは、メッセージキューからメッセージを取り出して、ハンドラのdispatchMessageメソッドを使って処理します。
- HandlerThreadのquitメソッドを呼び出すとLooperのループが停止するため、スレッドが終了します。
ハンドラースレッドの使用は次のとおりです。
- ハンドラー スレッド オブジェクトを作成し、start メソッドを呼び出してスレッドを開始します。
HandlerThread handlerThread = new HandlerThread("MyHandlerThread");
handlerThread.start();
- ハンドラオブジェクトを作成し、ハンドラスレッドのルーパーオブジェクトをハンドラのコンストラクタに渡す。
Handler handler = new Handler(handlerThread.getLooper());
- 時間がかかる操作はバックグラウンドスレッドで実行し、ハンドラを使用してメインスレッドにメッセージを送信します。
handler.post(new Runnable() {
@Override
public void run() {
// 执行耗时操作
// 发送消息到主线程
handler.post(new Runnable() {
@Override
public void run() {
// 在主线程中更新UI
}
});
}
});
ハンドラースレッドを使用すると、時間のかかる操作をバックグラウンドスレッドで実行して、メインスレッドのブロックを避け、アプリケーションの応答性能を向上させることができます。さらに、ハンドラーを使用すると、バックグラウンドスレッドとメインスレッドの間で簡単に通信を行い、UIの更新などの操作を行うことができます。