1

私の見方に問題がありpostInvalidateます。MainFormViewRefresh定期的にウェイクアップpostInvalidate()し、ビューのメソッドのみを呼び出すスレッドがあります。これにより、mainUI スレッドが起動し、最終的にビューのonDraw()メソッドが呼び出されて再描画されるはずですが、メイン スレッドはpostInvalidate()が呼び出されても長時間スリープ状態になっています。

UI スレッドがブロックされてMessageQueue#nativePollOnceおり、から復帰しませんpostInvalidate()。用事があっても寝ているのはなぜ?私のpostInvalidate()電話がありませんか?私の理解では、 はpostInvalidateイベントをキューに入れ、 でブロックしている UI スレッドを起動する必要がありますnativePollOnce。CPU は約半分の時間スリープしているため、最大 50% しか使用されていません。

写真は問題を示しています。MainFormViewRefresh のアクティビティの各スパイクは、への呼び出しで終了しますpostInvalidate()。メイン スレッドの非アクティブ期間は、ブロックされている時間MessageQueue#nativePollOnceです。ご覧のとおりpostInvalidate()、メイン スレッドを起動せずに数回呼び出されます。

mainスレッドの主な活動期間はonDraw()(青) です。

実行中のスレッドの表示

4

0 に答える 0