Android Handlerメカニズムの詳細

1658 ワード

HandlerメカニズムはAndroidマルチスレッド開発に不可欠な一部である.その一般的な使用シーンは、サブスレッドでUIインタフェースを更新します.Androidプロジェクトを開発したことがある人なら誰でも知っているはずですが、Androidマスタースレッドでは時間のかかる操作はできないので、時間のかかる(ネットワークリクエスト操作、大ファイル処理など)はサブスレッドで行うべきですが、Androidマスタースレッドは安全ではないため、サブスレッドでUI操作を行うことはできません.このときHandlerメカニズムはサブスレッド更新UIの橋渡しとなった.
Handlerメカニズムを学ぶには,まずその実現原理を理解する必要がある.その実現過程において,Handler,Message,MessageQue,Looperは不可欠な4つの要素である.ここではまず、Handlerメカニズムの動作原理を簡単に説明します.HandlerによってMessageをMessage Queに挿入し(sendMessage()/postMessage())、その後、LooperオブジェクトポーリングによってMessage QueのMessageオブジェクト(next()メソッドを取り出します.さらに、Handlerオブジェクトを実装するonHandMessage()メソッドによって、Messageオブジェクトが携帯する対応するイベントが配布される.
Handler 
メッセージの送信者だけでなく、メッセージの処理者でもある.メッセージはsendMessage()postMessage()などの方法でMessage Queに挿入され、onHandMessage()によって受信され、処理される.
Message
メッセージオブジェクトには、独自の記述情報とHandlerに送信できる任意のデータオブジェクトが含まれます.このオブジェクトには、intタイプのextraフィールドとobjectタイプのextraフィールドが2つ含まれています.これらを使用すると、多くの場合、メモリ割り当て作業を自分で行う必要はありません.
Messageをインスタンス化する最善の方法はMessageを呼び出すことである.Obtain()またはHandler.obtainMessage()(実際に最終的に呼び出されたのは依然としてMessage.obtain()である)は、この2つの方法はいずれも1つのリサイクル可能な利用からである
のオブジェクトプールでMessageを取得します.
MessageQue
MessageQueueは、Messageを格納するための集合であり、Looperインスタンスによって中のMessageオブジェクトが配布されます.
Looper
Looperはスレッドがメッセージポーリングを実行するクラスです.デフォルトでは、スレッドに関連付けられていないLooperは、スレッド内でLooper.prepare()メソッドを呼び出すことによって取得し、すべてのメッセージがすべて処理されるまで、Looper.loop()によってMessageQueue内のメッセージを無限にループして取得して配布することができる.
MessageQueインスタンスを取得すると、Looperオブジェクトはデッドループを開き、next()メソッドを呼び出すことでMessageQueのメッセージを読み込みます.メッセージがない場合、Looperはスリープ状態になり、次のメッセージが入っていることを知っています.(これによりCPUの無駄が回避される).
以上が私個人のHandlerメカニズムに対するいくつかの理解です.皆さんとたくさん交流してほしいです.