自定义的View一般都不是静态的,所以都需要对其进行刷新:
根据实际使用的不同场合需要采用不同的刷新策略,下面是三种常用的刷新方式:

  • 不使用多线程和双缓冲
    这种情况一般使用在不需要频繁刷新的情况下,只需显式地调用View中的invalidate()方法系统会自动调用View的onDraw()方法。

  • 使用多线程但不使用双缓冲
    这种情况需要开启新的线程,但是我们知道如果在非UI线程中访问View对象就会报如下错误:

    android.view.ViewRoot$CalledFromWrongThreadException
    Only the original thread that created a view hierarchy can touch its views.

    这时候就需要结合Handler来处理了,只要新建一个Handler,在新线程创建并发送一个Message,然后再主线程中捕获、处理该消息。

  • 使用多线程和双缓冲
    这个就是通过SurfaceView来实现的,我们在绘图专题中已经对SurfaceView进行介绍了,大家可以翻阅之前的博文,查看。

Android中实现view的更新有两组方法,一组是invalidate,另一组是postInvalidate,其中前者是在UI线程自身中使用,而后者在非UI线程中使用。
Android提供了Invalidate方法实现界面刷新,但是Invalidate不能直接在线程中调用,因为他是违背了单线程模型:Android UI操作并不是线程安全的,并且这些操作必须在UI线程中调用。
Android程序中可以使用的界面刷新方法有两种,分别是利用Handler和利用postInvalidate()来实现在线程中刷新界面。

Contents