書きながら整理しましょう:
I. スレッドには何人のハンドラーがいますか?
次に、1つのスレッドに何人のループアがいて、それはどのように保証されているのですか?
第三に、ハンドラのメモリリークの原因?なぜ他の内部クラスはこの問題について何も言わないのですか?
なぜメインスレッドが新しいハンドラーになれるのですか、また、サブスレッドで新しいハンドラーを作りたい場合はどうすればいいのですか?
V.ルーパーは、サブスレッドに保持され、メッセージ処理スキームがない場合のメッセージキューは何ですか?どのような使用ですか?
6、MessageQueueにデータを追加するHandlerが複数存在する可能性があるため、内部的にはスレッドセーフをどのように確保するか?
メッセージはどのように作成すればよいですか?
VIII.ルーパーのデッドループは、なぜアプリケーションがスタックしないのですか?
ハンドラ実行プロセス
handler->sendMessage->MessageQueue.enqueueMessage(message queued)
MessageQueue のデータ格納構造は、プライオリティ・キューです。MessageQueueは時間順にソートされたプライオリティ・キューで、このキューの実装は連鎖テーブルですが、そのルックアップや挿入などはキューの特性に沿ったものです。
新しいメッセージがキューに入ると、for ループして時系列的に判断し、指定された位置に挿入します。
入団時期の判断:新規入団時と入団後の時期の比較
MessageQueue の next メソッドが実行されると、現在時刻とキュー内の最初の時刻を比較し続け、現在時刻がキュー内の最初の時刻より大きい場合、最初の msg が返されます。
Looper.loopはMessageQueue.next->handler->handlerMessageを呼び出し続けます。
MessageQueue.next のデッド・ループは msg が存在すると RETURNS するので、実際にはデッド・ループは発生しません。
I. スレッドには何人のハンドラーがいますか?
1つのスレッドに複数のハンドラ
次に、1つのスレッドに何人のループアがいて、それはどのように保証されているのですか?
スレッドがルーパーを持つ => 原因:スレッドローカル
ThreadLocalはどのようにこれを保証するのですか?
Map構造内のEntryはシーケンシャルなテーブルで、各Entryはキーと値のペアです。





