blog

ゼロからのAndroid - ハンドラー

プライオリティ・キューのデータ格納構造。 このキューの実装は連鎖テーブルですが、ルックアップや挿入などはキューの特徴に準拠しています。 新しいメッセージがキューに入力されると、forループして時間順の...

Jun 23, 2020 · 2 min. read
シェア

書きながら整理しましょう:

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はキーと値のペアです。

Read next

論文は、最も複雑な並行処理ツールクラスの読み取りと書き込みロックのソースコードを理解する

前の記事は、クラスの実装では、AQSの使用を分析し、今日は最後と最も複雑な1。1つだけのスレッドをサポートするために同じ瞬間の主な機能は、ロックを持っていますが、ほとんどの場合、次のとおりです。

Jun 22, 2020 · 4 min read