非同期メッセージ処理スレッド

1895 ワード

通常のスレッドがrun()メソッドを実行するとスレッドは終了し、非同期メッセージ処理スレッドとは、スレッドが起動すると無限ループに入り、ループごとにメッセージキューからメッセージが1つ取り出され、メッセージ処理関数がコールバックされることを意味する.メッセージを実行した後、ループを続行します.メッセージ・キューが空のスレッドの場合、メッセージ・キューに新しいメッセージが表示されるまで一時停止します.
一般的な実装
  • 各非同期スレッドにはメッセージキューが含まれ、先着メッセージは
  • に処理される.
  • スレッドの実行体ではwhile(true)ループを使用してメッセージキューからメッセージを絶えず取り出し、メッセージソースに基づいて対応するメッセージ処理関数
  • をコールバックする.
  • 外部スレッドは、このスレッドのメッセージキューにメッセージを送信することができ、メッセージキュー内部の読み取り/書き込み操作はロックされなければならず、メッセージキューは同時に読み書き操作を行うことができない.

  • Androidにおける非同期スレッドの実現方式
    スレッドの内部には1つ以上のHandlerオブジェクトがあり、外部プログラムはhandlerを介してスレッドに非同期メッセージを送信し、メッセージはhandlerを介してmessagequeueに伝達される.スレッドの内部にはmessagequeueオブジェクトが1つしかありません.スレッドマスター実行関数メッセージからメッセージを読み込み、handlerオブジェクトのhandleMessage()関数をコールバックします.
  • スレッドローカル変数(ThreadLocal)、すなわち変数の役割ドメインはスレッドである.同じスレッドから変数を参照します.値は常に同じです.
  • Looper.prepare()メソッドはMessageQueueオブジェクトを作成します.各looperオブジェクトは1つのMessageQueueオブジェクトを定義するので、1つのスレッドに1つのlooperオブジェクト
  • しかありません.
  • Looperの役割.1つはLooperクラスのprepare()関数を呼び出すスレッドにメッセージキューを作成することであり,2つはloop()関数を提供し,その関数を呼び出すスレッドを無限ループさせ,メッセージキューからメッセージを取り出すことである.Looperの静的関数prepare()関数では、スレッドのローカルストレージ変数にLooperオブジェクトが追加され、looperのコンストラクション関数ではMessageQueueオブジェクト
  • が作成されます.
    loop()関数
    public static final void loop()
         {
             Looper me=myLooper();
             MessageQueue queue=me.mQueue;
             while(true)
             {
                 Message msg=queue.next();
                 //.......
             }

    このコードの実行フロー:現在のスレッドのLooperオブジェクトを返す後、無線ループに入ってメッセージキューメッセージを読み込み、msgをコールバックする.target.dispatchMessage()関数は、メッセージの処理を完了します.メッセージの処理が完了するたびにmsgを呼び出す.recycle()関数は、Messageオブジェクトが占有するシステムリソースを回収します.