実用的な乾物!ハンドラーに関連する奇妙なバグを解決するために、新しいアイデアをすばやく見つけて解決します

バックグラウンド

最近、新しいプロジェクトを引き継いで、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

最後に、メッセージを送信するスレッド(子スレッド)で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 ]、自分で入手できます。

おすすめ

転載: blog.csdn.net/weixin_44339238/article/details/112285816