【Android】android中Invalidate和postInvalidate的区别
Android中实现view的更新有两组方法,一组是invalidate,另一组是postInvalidate,其中前者是在UI线程自身中使用,而后者在非UI线程中使用。 
Android提供了Invalidate方法实现界面刷新,但是Invalidate不能直接在线程中调用,因为他是违背了单线程模型:Android UI操作并不是线程安全的,并且这些操作必须在UI线程中调用。
Android程序中可以使用的界面刷新方法有两种,分别是利用Handler和利用postInvalidate()来实现在线程中刷新界面。
1,利用invalidate()刷新界面 
  实例化一个Handler对象,并重写handleMessage方法调用invalidate()实现界面刷新;而在线程中通过sendMessage发送界面更新消息。
// 在onCreate()中开启线程
new Thread(new GameThread()).start();、
// 实例化一个handler
Handler myHandler = new Handler() {
// 接收到消息后处理
public void handleMessage(Message msg) {
  switch (msg.what) {
    case Activity01.REFRESH:
      mGameView.invalidate(); // 刷新界面
      break;
  }
  super.handleMessage(msg);
}
};
class GameThread implements Runnable {
  public void run() {
    while (!Thread.currentThread().isInterrupted()) {
      Message message = new Message();
      message.what = Activity01.REFRESH;
      // 发送消息
      Activity01.this.myHandler.sendMessage(message);
      try {
          Thread.sleep(100);
      } catch (InterruptedException e) {
        Thread.currentThread().interrupt();
      }
  }
}
}
2,使用postInvalidate()刷新界面 
使用postInvalidate则比较简单,不需要handler,直接在线程中调用postInvalidate即可。
class GameThread implements Runnable {
    public void run() {
    while (!Thread.currentThread().isInterrupted()) {
        try {
            Thread.sleep(100);
        } catch (InterruptedException e) {
    Thread.currentThread().interrupt();
  } 
  // 使用postInvalidate可以直接在线程中更新界面
  mGameView.postInvalidate();
  }
}
}
public void postInvalidate() {
        postInvalidateDelayed(0);
}
public void postInvalidateDelayed(long delayMilliseconds) {
        // We try only with the AttachInfo because there's no point in invalidating
        // if we are not attached to our window
        if (mAttachInfo != null) {
            Message msg = Message.obtain();
            msg.what = AttachInfo.INVALIDATE_MSG;
            msg.obj = this;
            mAttachInfo.mHandler.sendMessageDelayed(msg, delayMilliseconds);
        }
    }
【Android】android中Invalidate和postInvalidate的区别的更多相关文章
- android中Invalidate和postInvalidate的区别
		Android中实现view的更新有两组方法,一组是invalidate,另一组是postInvalidate,其中前者是在UI线程自身中使用,而后者在非UI线程中使用. Android提供了Inva ... 
- Android笔记:invalidate()和postInvalidate() 的区别及使用
		http://blog.csdn.net/mars2639/article/details/6650876 Android提供了Invalidate方法实现界面刷新,但是Invalidate不能直接在 ... 
- Android笔记:invalidate()和postInvalidate() 的区别及使用——刷新ui
		Android提供了Invalidate方法实现界面刷新,但是Invalidate不能直接在线程中调用,因为他是违背了单线程模型:Android UI操作并不是线程安全的,并且这些操作必须在UI线程中 ... 
- Android中Invalidate与postInvalidate的区别<转>
		http://www.cnblogs.com/it-tomorrow/archive/2012/11/08/2760146.html 示例:http://rayleung.iteye.com/blog ... 
- Android中刷新Invalidate和postInvalidate的区别
		Android中实现view的更新有两组方法,一组是invalidate,另一组是postInvalidate,其中前者是在UI线程自身中使用,而后者在非UI线程中使用.Android提供了Inval ... 
- Android界面刷新之invalidate与postInvalidate的区别
		Android的invalidate与postInvalidate都是用来刷新界面的. 在UI主线程中,用invalidate():本质是调用View的onDraw()绘制. 主线程之外,用postI ... 
- Android  invalidate() 和 postInvalidate()的区别
		Android提供了Invalidate方法实现界面刷新,但是Invalidate不能直接在线程中调用,因为他是违背了单线程模型:Android UI操作并不是线程安全的,并且这些操作必须在UI线程中 ... 
- android中Invalidate和postInvalidate的差别
		Android中实现view的更新有两组方法,一组是invalidate.还有一组是postInvalidate.当中前者是在UI线 程自身中使用,而后者在非UI线程中使用. Android提供了In ... 
- invalidate()和postInvalidate() 的区别及使用
		Android提供了Invalidate方法实现界面刷新,但是Invalidate不能直接在线程中调用,因为他是违背了单线程模型:Android UI操作并不是线程安全的,并且这些操作必须在UI线程中 ... 
随机推荐
- 0801 am使用tp框架对数据库增删改查
			增添数据,3种方法 function Text3() { $m=D("info"); //1.使用数组 $attr = array( "code"=>&q ... 
- ICE系列之2——ICE的服务与好处
			ice服务: IcePack 我们在第 12 页提到过, IcePack 是 Ice 的定位服务,用于在使用间接绑定时把符号性的 (symbolic)适配器名解析为协议-地址对. 除了 ... 
- memcached 基本操作
			保存数据 向memcached保存数据的方法有 add replace set 它们的使用方法都相同: my $add = $memcached->add( '键', '值', '期限' );m ... 
- 个人博客作业week5
			请阅读下述关于敏捷开发方法文章,并在个人博客上写一篇读后感. Martin Fowler: http://martinfowler.com/agile.html 截止时间:10月20日前. 
- matlab微分方程dsolve使用
			y=dsolve('Dy=exp(-x-y-2)','y(0)=-2','x') dy/dx 写成Dy (注意大小写) y(0)=-2 表示初始条件 'x'表示积分变量 
- CCF 201409-2	画图 (暴力)
			问题描述 在一个定义了直角坐标系的纸上,画一个(x1,y1)到(x2,y2)的矩形指将横坐标范围从x1到x2,纵坐标范围从y1到y2之间的区域涂上颜色. 下图给出了一个画了两个矩形的例子.第一个矩形是 ... 
- DBHelp数据处理类
			using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.T ... 
- SWAP空间不足,如何进行添加
			交换分区值过小,可以有两种方法来增加swap分区,一种是将新的分区来作为swap,另一种是在磁盘中创建一个大的文件来作swap. 我们以文件扩展swap [root@xuegod63 ~]# cd / ... 
- FastDFS基本结构(转)
			0.简介 FastDFS是基于互联网应用的开源分布式文件系统,主要用于大中型网站存储资源文件,如图片.文档.音频.视频等.FastDFS采用类似GFS的架构,用纯C语言实现,支持Linux.FreeB ... 
- H3C dhcp 中继
			需求描述RT1作为DHCP服务器创建两个全局地址池:192.168.10.0/24 192.168.20.0/24 RT1和RT3属于VLAN 10 RT2属于VLAN 20 在交换机上配置DHCP中 ... 
