Android ではハンドラーは重要ですか? なぜ学ぶのか

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 の技術的重要性について主に説明します

  1. Handler メカニズムの AsyncTask ソース コード分析
  2. Handler メカニズムの Callable、Future、FutureTask
  3. ハンドラーメカニズム
  4. ハンドラー機構のルーパーとハンドル
  5. Handler機構のMessageQueue
  6. ハンドラーメカニズムのメッセージの紹介とメッセージオブジェクト
  7. ハンドラーメカニズムのネイティブ実装
  8. ハンドラー機構のスレッド
  9. ハンドラー機構の ThreadLocal
  10. Handler機構のメッセージ送信
  11. Handler機構のループ機構

最終的なまとめ

ハンドラーは Android システムの中核コンポーネントであり、スレッド化とメッセージングで重要な役割を果たします。これは、ユーザーが異なるスレッドでメッセージ配信とタスク実行を実装するのに役立ち、多くの実用的な方法を提供します。

Handler を使用する最も基本的な目的は、マルチスレッドの同時実行の問題を解決することであり、Android では UI を更新するためのこのメカニズムが提供されているため、このメカニズムに従うだけで済みます。マルチスレッドの問題に対処する必要はもうなく、UI を更新するすべての操作はメイン スレッドのメッセージ キュー内でローテーションで実行されます。Looper が管理する MessageQueue にメッセージを送信し、Looper によって配布されたメッセージを処理します。

おすすめ

転載: blog.csdn.net/m0_70748845/article/details/132674269