1、Invalidate和postInvalidate的区别
Android提供了Invalidate方法实现界面刷新,但是Invalidate不能直接在线程中调用,因为他是违背了单线程模型:Android UI操作并不是线程安全的,并且这些操作必须在UI线程中调用。
鉴于此,如果要使用invalidate的刷新,那我们就得配合handler的使用,使异步非ui线程转到ui线程中调用,如果要在非ui线程中直接使用就调用postInvalidate方法即可(注意只有在自定义View的内部调用postInvalidate方法才会触发onDraw方法,在activity中直接View.postInvalidate是不会触发onDraw方法的),这样就省去使用handler的烦恼。
2、Invalidate和requestLayout在什么时候用呢?
当view确定自身已经不再适合现有的区域时,该view本身调用这个方法要求parent view(父类的视图)重新调用他的onMeasure、onLayout来重新设置自己位置并调用onDraw方法重绘。特别是当view的layoutparameter发生改变,并且它的值还没能应用到view上时,这时候适合调用这个方法。 Invalidate调用onDraw方法,requestLayout调用onMeasure和onLayout,不一定调用onDraw,满足view的l,t,r,b发生改变,onDraw就会调用,不然不会被调用。因此调用完requestLayout,记得在调用invalidate(为了保证重绘)。
网友评论