可以先了解下重翻已生灰的Android书—View绘制流程及原理
###Android是16ms刷新一次屏幕,它是怎么刷新的??
在ViewRootImpl —> requestLayout()发起UI重绘 --> scheduleTraversals()
###什么时候置为false??
在mTraversalRunnable,这个Runnable线程是接收到Vsync信号,才会执行doTraversal()
Vsync主要的执行方法是在Choreographer中,FrameDisplayEventReceiver的onVsync方法
[外链图片转存失败(img-e4M4KZJJ-1566129323831)(https://upload-images.jianshu.io/upload_images/3156973-6eef9f39124d21e7.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)]
参数timestampNanos是Vsync信号的时间戳,这是用来计算耗时,也就是为什么会出现丢帧。
丢帧的原因:主线程做耗时操作,根本原因是Vysnc信号的接收,和View的重绘,调用onDraw方法时机啥的都没关系。
View调用onDraw方法,不会立即执行,必须要接收到Vysnc信号,每隔16ms刷新屏幕,即使View没有被重绘,还是会每隔16ms刷新,只不过刷新的都是旧的同一个数据。
个人总结:屏幕刷新主要在Choreographer中调用的Vsync信号的接收。
###这篇文章写的很详细Android 屏幕刷新机制