Android では、Handler の主な機能は、スレッド間の通信を実現し、非同期タスクを処理することです。最も簡単な言葉で説明します。ハンドラーは実際にはサブスレッドを開始するメインスレッドであり、サブスレッドが実行されてメッセージを生成します。Looper はメッセージを取得してハンドラーに渡し、ハンドラーはサブスレッド内のメッセージを取得します。一つずつ。
Binder/Socket はプロセス間通信に使用され、Handler メッセージ メカニズムは同じプロセスのスレッド間通信に使用されます。メインスレッドと通信する非同期スレッドがある限り、ハンドラーが必ず存在すると言えます。
ハンドラーの原理
マルチスレッドアプリケーションシナリオでは、ワーカースレッドでUIを更新するために必要な操作情報がUIメインスレッドに送信され、ワーカースレッドによるUIの更新処理が実現され、最終的にUIの更新処理が実現されます。非同期メッセージ。
ハンドラー メッセージ受け渡しメカニズムを使用する主な目的は、複数のスレッドが UI を同時に更新する際にスレッドの安全性を確保することです。
ハンドラーの基本的な使い方
メインスレッドでハンドラーを使用する
メインスレッドで Handler を使用すると、 getMainLooper() を直接使用してメインスレッド Looper オブジェクトを取得し、Handler インスタンスを作成できます。たとえば、アクティビティの子スレッドの UI を更新します。
new Thread(new Runnable() {@Overridepublic void run() {// 子线程中进行耗时操作...// 完成后在主线程中更新UImHandler.post(new Runnable() {@Overridepublic void run() {// UI更新代码}});}
}).start();
子スレッドでハンドラーを使用する
子スレッドで UI を更新するには、メッセージがメッセージ キューで実行できるように、現在のスレッドの Looper オブジェクトを Handler インスタンスに関連付ける必要があります。
new Thread(new Runnable() {@Overridepublic void run() { 在子线程中进行耗时操作...Message message = mHandler.obtainMessage(MSG_ID, arg1, arg2);mHandler.sendMessage(message);}
}).start();mHandler = new Handler(new Handler.Callback() {@Overridepublic boolean handleMessage(Message msg) {switch (msg.what) {case MSG_ID:// UI更新代码return true;default:return false;}}
});
ハンドラーの共通タスク
3.1 タスクの実行の遅延
Handler.postDelayed() メソッドを使用して、メッセージをメッセージ キューに送信する前に一定期間遅延させます。例えば:
mHandler.postDelayed(new Runnable() {@Overridepublic void run() {//执行延迟任务}
}, DELAY_MILLIS);
3.2 定期的にタスクを実行する
Handler.postDelayed()メソッドとHandler.sendMessage()メソッドを組み合わせることで、タスクを定期的に実行する機能を実現できます。
mHandler.postDelayed(new Runnable() {@Overridepublic void run() {// 周期性执行任务mHandler.sendMessageDelayed(Message.obtain(mHandler, MSG_ID), INTERVAL);}
}, DELAY_MILLIS);
3.3 複数のタスクが順番に実行される
マルチタスクは順次実行され、メッセージ キューを使用して複数のメッセージを処理できます。
mHandler.sendMessage(Message.obtain(mHandler, TASK1_ID, arg1, arg2));
mHandler.sendMessage(Message.obtain(mHandler, TASK2_ID, arg1, arg2));
mHandler.sendMessage(Message.obtain(mHandler, TASK3_ID, arg1, arg2));
各メッセージは、ハンドラーの handleMessage() メソッドで個別に処理されます。
ハンドラー呼び出しメソッドの類似点と相違点
Handler を使用してメッセージ キューにメッセージを追加するには、post() メソッドと sendMessage() メソッドの 2 つの方法があります。2 つの方法の類似点と相違点は次のとおりです。
4.1 同期メソッドと非同期メソッド
- post() メソッドは同期です。つまり、メッセージ キューにメッセージを追加した後、メッセージ ブロッキング ハンドラーが戻るのを待たずに、メッセージは直接処理されます。
- sendMessage() メソッドは非同期です。つまり、メッセージをメッセージ キューに追加した後、メッセージはすぐには実行されず、メッセージ ブロッキング ハンドラーが戻るまで待機します。
4.2 メソッドパラメータ
- post() メソッドのパラメータは Runnable オブジェクトであり、Runnable オブジェクト内の run() メソッドは実行されるタスク コードです。
- sendMessage() メソッドのパラメータは Message オブジェクトであり、Message オブジェクトの what フィールドはメッセージ ID であり、arg1 と arg2 はハンドラに渡すことができるパラメータです。
4.3 遅延時間パラメータ
- postDelayed() メソッドは、Runnable オブジェクトをメッセージ キューに入れて、指定された時間実行を遅延します。その 2 番目のパラメーターは DelayMillis です。post() メソッドは遅延時間パラメータをサポートしていません。
- sendMessageDelayed() メソッドは、Message オブジェクトをメッセージ キューに入れ、指定された時間実行を遅延します。その 2 番目のパラメーターは DelayMillis です。sendMessage() メソッドは、遅延時間パラメーターをサポートしていません。
この記事では、Android 開発における Handler の技術的重要性について主に説明します。
- Handler メカニズムの AsyncTask ソース コード分析
- Handler メカニズムの Callable、Future、FutureTask
- ハンドラーメカニズム
- ハンドラー機構のルーパーとハンドル
- Handler機構のMessageQueue
- ハンドラーメカニズムのメッセージの紹介とメッセージオブジェクト
- ハンドラーメカニズムのネイティブ実装
- ハンドラー機構のスレッド
- ハンドラー機構の ThreadLocal
- Handler機構のメッセージ送信
- Handler機構のループ機構
最終的なまとめ
ハンドラーは Android システムの中核コンポーネントであり、スレッド化とメッセージングで重要な役割を果たします。これは、ユーザーが異なるスレッドでメッセージ配信とタスク実行を実装するのに役立ち、多くの実用的な方法を提供します。
Handler を使用する最も基本的な目的は、マルチスレッドの同時実行の問題を解決することであり、Android では UI を更新するためのこのメカニズムが提供されているため、このメカニズムに従うだけで済みます。マルチスレッドの問題に対処する必要はもうなく、UI を更新するすべての操作はメイン スレッドのメッセージ キュー内でローテーションで実行されます。Looper が管理する MessageQueue にメッセージを送信し、Looper によって配布されたメッセージを処理します。