一日一钱,千日一千。绳锯木断,水滴石穿。

View#invalidate方法是如何更新UI的

Posted on By TinyVampirePudge

View#invalidate方法是如何更新UI的

这里拿TextView#setText 举一个例子:

TextView.setText()  —> 
TextView#checkForRelayout  —> 
View#invalidate —> 
View#invalidateInternal -> 
ViewParent#invalidateChild  —> 
ViewGroup#invalidateChild do-while循环调用 —> 
ViewRootImpl#invalidateChildInParent —> 
viewRootImpl#checkThread 和
viewRootImpl#invalidate —> 
viewRootImpl#scheduleTraversals —> 
mChoreographer(内部维护了一个FrameHandler).postCallback(mTraversalRunnable….) —> 
doTraversal -> 
ViewRootImpl#doTraversal --> 
ViewRootImpl#performTraversals 就会调用 onMeasure onLayout onDraw。

从整个调用链来看,应该会将刷新视图事件包装成一个Runable,添加至MessageQueue中,Looper轮询取出,Handler#handleMessage接收到绘制事件回调并调用viewRootImpl#performTraversals完成最终绘制.