简单学习了下android中的UI界面刷新,大家看看我对invalidate和postInvalidate的理解有什么不对的地方,下面也提到几个不懂的问题,请大家赐教!    Android中在绘图中的多线程中,invalidate和postInvalidate这两个方法是用来刷新界面的,调用这两个方法后,会调用onDraw事件,让界面重绘。    书上提到invalidate不能直接在线程中调用,这里的线程是指的子线程(非UI线程)吧?因为在非UI线程中调用invalidate会导致线程不安全,也就是说可能在非UI线程中刷新界面的时候,UI线程(或者其他非UI线程)也在刷新界面,这样就导致多个界面刷新的操作不能同步,导致线程不安全,是不是这样?    在非UI线程中我们可以使用Handler类来发送消息到UI线程队列中,由UI线程来负责安排刷新界面。这是线程安全的。
    
    如果要在非UI线程中刷新界面,需要用到postInvalidate,使用这个方法不用Handler来接收消息,能直接刷新,那么postInvalidate这个方法是如何保证线程安全的呢??    另外,主线程就是UI线程吗?子线程就是非UI线程吗?如何区分UI线程和非UI线程,是不是在onCreate里面写的代码属于UI线程,其他地方是非UI线程?

解决方案 »

  1.   

    1. 书上提到invalidate不能直接在线程中调用...
    主要就是同步的问题。
    2.如果要在非UI线程中刷新界面...
    invalidate()得在UI线程中被调动,在工作者线程中可以通过Handler来通知UI线程进行界面更新。而postInvalidate()在工作者线程中被调用
    3.另外,主线程就是UI线程吗...
    主线程就是你的程序的主activity所在线程。子线程就是在主activity中new出来的那些thread,不只是onCreate的里才是主线程,ondestroy,onresume等,和对应整个activity的所有处理都是属于主线程的。规定就是主线程中用invalidate,子线程中只能用handler或者直接post才行。
      

  2.   

    postInvalidate()好像是用户线程中强制刷新的
      

  3.   

    http://shazhuzhu1.iteye.com/blog/971193
    这一篇挺好。
      

  4.   

    http://blog.csdn.net/mars2639/article/details/6650876