バックグラウンド
最近、新しいプロジェクトを引き継いで、Handlerに関連するバグに遭遇しましたが、解決するのに時間がかかり、最終的に別のアイデアで解決しました。
この記事を通して、私はそれをあなたと共有し、またあなたが後でハンドラー関連の問題を素早く見つけて解決するのを助けます。
問題の説明
問題は、ハンドラーによって送信されたメッセージがhandleMessageで受信されないことです。
もちろん、メッセージが送信される場所とメッセージが受信される場所は同じファイルではありません。
HandlerはHashMapを通じて一律に管理されていると考えることができます。
アイデア1
送信されたハンドラーと受信されたハンドラーは異なりますか?
結局のところ、それはHashMapによって管理されていますが、置き換えることはできますか?
検証方法:ハンドラーの参照を出力して確認します。結果は同じハンドラーです。
アイデア2
送信されたメッセージはremoveによって削除されますか?
検証方法:確認のために新しい一意のmsg.whatが導入されましたが、結果が受信されませんでした。
アイデア3
/**
* Sends a Message containing only the what value.
*
* @return Returns true if the message was successfully placed in to the
* message queue. Returns false on failure, usually because the
* looper processing the message queue is exiting.
*/
public final boolean sendEmptyMessage(int what)
{
return sendEmptyMessageDelayed(what, 0);
}
ソースコードのコメントから、メッセージがすでにキューにある場合は再度詰め込まれませんが、キューがすでに存在する場合は受信されないことがわかります。
最後に、戻り値を出力するのは正しいことです。
このアイデアでは問題は解決しませんでしたが、このため、別のアイデアが開かれました。つまり、キューがブロックされ、メッセージがスタックしますか?
最終検証方法
したがって、最後に、メッセージキューに問題があり、アイドルメッセージコールバックがないかどうかを確認するためにIdleHandlerが導入されました。
IdleHandlerについては、通常、ハンドラーがアイドル状態のときにコールバックすることを簡単に説明します。リッスン後に削除しないと、常にコールバックします。
使用法の1つは、初期化を遅らせてインターフェイスのレンダリング速度を向上させることです。
詳細については、以下を参照してください。
最後に、メッセージを送信するスレッド(子スレッド)でIdleHandlerを使用するとコールバックがなく、元のハンドラーがメインスレッド上に構築されていることが確認されました。
したがって、根本的な原因は、ハンドラーのスレッドが変更され、それが継続的にメッセージを生成するサブスレッドのメッセージであるため、キューが常に占有され、新しく送信されたメッセージを受信できない可能性があります。 。
Android開発関連のソースコードの洗練された分析
Android開発業界が徐々に飽和状態になるにつれ、Android開発者の面接要件はますます高くなっています。基盤となるソースコードをマスターするかどうかは、Android開発者をテストする上で重要な部分です。面接で聞いたところ、ソースコードの質問に答えられず、価値を失い、給料を下げて話もせず、面接にも合格できませんでした!
インターネット上には、ソースコード分析のためのさまざまな種類のブログがあります。良いものも悪いものもあります。散らかっていたり、内容が浅すぎたり、断片化していたり、断片化していたりして、見ると繋がりません。
そこで、流行の4か月間を費やした「Android開発関連のソースコードのコンパイルと分析」を意図的に共有しました。
コンテンツが多いため、すべての人の読書体験に影響を与えないように、ここではスクリーンショットのみがカタログ部分、「Android開発関連ソースコードのコンパイルと分析」の487詳細かつ完全なバージョンの電子書籍ドキュメントの収集方法を示しています。私のホームページスキャンとWeChatが私的にあなたに送られました(無料)〜
内容: MMKVソースコード、ARouterソースコード、AsyncTaskソースコード、Volleyソースコード、Retrofitソースコード、OkHttpソースコード、ButterKnifeソースコード、Okioソースコード、SharedPreferencesソースコードを含む合計18セクション、487ページのPDF EventBusソースコード、Androidカスタム注釈の予備調査、作業の表示メカニズムのソースコード分析、Androidタッチイベント配布メカニズムのソースコード分析、Androidキーイベント配布メカニズムのソースコード分析、ハンドラーソースコードの詳細分析、バインダーの詳細分析ソースコード、JNIソースコードの詳細な分析、およびGlideソースコードの詳細な分析。
「Android開発関連ソースコードのコンパイルと分析」の電子書籍ドキュメントの入手方法:
上記のコンテンツ はオープンソースプロジェクトに含まれています:[ github ]、自分で入手できます。