postInvalidate
我的观点有问题。我有一个调用的线程MainFormViewRefresh
会定期唤醒,并且只postInvalidate()
为我的视图调用该方法。这应该唤醒main
UI 线程并最终调用视图的onDraw()
方法并重新绘制它,但是即使postInvalidate()
调用主线程也只是长时间休眠。
UI 线程被阻塞MessageQueue#nativePollOnce
,它不会从postInvalidate()
. 为什么它有事要睡觉?它错过了我的postInvalidate()
电话吗?我的理解是postInvalidate
应该在队列中放置一个事件并唤醒阻塞的 UI 线程nativePollOnce
。CPU 最多只有 50%,因为它大约有一半的时间在休眠。
图片说明了这个问题。MainFormViewRefresh 上的每个活动峰值都以调用postInvalidate()
. 主线程中的不活动时间段是其花费的时间MessageQueue#nativePollOnce
。可以看出,postInvalidate()
在不唤醒主线程的情况下多次调用。
main
线程上的主要活动周期是onDraw()
(蓝色)。