为什么80%的码农都做不了架构师?>>>   

Android提供了Invalidate方法实现界面刷新,但是Invalidate不能直接在线程中调用,因为他是违背了单线程模型:android UI操作并不是线程安全的,并且这些操作必须在UI线程中调用。

invalidate()是用来刷新View的,必须是在UI线程中进行工作。比如在修改某个view的显示时,调用invalidate()才能看到重新绘制的界面。invalidate()的调用是把之前的旧的view从主UI线程队列中pop掉。 一个Android 程序默认情况下也只有一个进程,但一个进程下却可以有许多个线程。

在这么多线程当中,把主要是负责控制UI界面的显示、更新和控件交互的线程称为UI线程,由于onCreate()方法是由UI线程执行的,所以也可以把UI线程理解为主线程。其余的线程可以理解为工作者线程。

invalidate()得在UI线程中被调动,在工作者线程中可以通过Handler来通知UI线程进行界面更新。

而postInvalidate()在工作者线程中被调用

利用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();
}
}
}
}

使用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();
}
}
}

转载于:https://my.oschina.net/kun123/blog/968000

Invalidate和postInvalidate相关推荐

  1. Android Custom View ----invalidate() 、postInvalidate() and requestLayout()

    <1>invalidate():View本身调用,迫使view重绘,需要在UI线程中自身调用.当View的appearance发生改变,比如状态改变(enable,focus),背景改变, ...

  2. View的invalidate和postInvalidate

    自定义View,如果要刷新,重绘View,可以利用invalidate和postInvalidate两个方法,当然还有其他方法可以实现重绘(requestLayout会导致重新进行测量,布局,绘制), ...

  3. Android --- android中Invalidate和postInvalidate的区别

    Android中实现view的更新有两组方法,一组是invalidate,另一组是postInvalidate,其中前者是在UI线程自身中使用,而后者在非UI线程中使用.  Android提供了Inv ...

  4. android 中的invalidate 和 postInvalidate

    存在原因:android只允许在ui线程更新ui. invalidate 在ui线程上请求更新view.比如直接在onDraw中调用: postInvalidate 用于在其他新启的线程处更新view ...

  5. Android笔记:invalidate()和postInvalidate() 的区别及使用(转载)

    原文 Android提供了Invalidate方法实现界面刷新,但是Invalidate不能直接在线程中调用,因为他是违背了单线程模型:Android UI操作并不是线程安全的,并且这些操作必须在UI ...

  6. (转)invalidate()和postInvalidate() 的区别及使用

    Android提供了Invalidate方法实现界面刷新,但是Invalidate不能直接在线程中调用,因为他是违背了单线程模型:Android UI操作并不是线程安全的,并且这些操作必须在UI线程中 ...

  7. invalidate()和postInvalidate() 的区别及使用

    Android提供了Invalidate方法实现界面刷新,但是Invalidate不能直接在线程中调用,因为他是违背了单线程模型:Android UI操作并不是线程安全的,并且这些操作必须在UI线程中 ...

  8. Android笔记:invalidate()和postInvalidate() 的区别及使用

    Android提供了Invalidate方法实现界面刷新,但是Invalidate不能直接在线程中调用,因为他是违背了单线程模型:Android UI操作并不是线程安全的,并且这些操作必须在UI线程 ...

  9. Android中的invalidate()和postInvalidate()

    invalidate()是用来刷新View的,必须是在UI线程中进行工作.比如在修改某个view的显示时,调用invalidate()才能看到重新绘制的界面.invalidate()的调用是把之前的旧 ...

最新文章

  1. 创建一个没有边框的并添加自定义文字的UISegmentedControl
  2. python什么模块动态调用链接库_python如何调用扩展模块
  3. Qt Creator创建可缩放的按钮和边框
  4. C#发布程序添加其他程序文件
  5. 【2017年第4期】大数据标准体系
  6. string字符串内容倒叙_面试官:string、stringbuffer和stringbuilder都不会,我招你干什么?...
  7. Linux 文件与目录管理,玩转文件和目录管理的相关命令
  8. Java 8 特性 – 终极手册
  9. hdu 2117(小数点后m位)
  10. 283.判断二分图(力扣leetcode) 博主可答疑该问题
  11. 最全的微信小程序代码大全
  12. 怎么选择boost升压电路的电感?只要三个公式
  13. jaxen-1.1-beta-6.jar下载地址
  14. Anaconda/Conda创建环境时报错的解决方案
  15. 如何用java制作二维码
  16. 【BiSeNet】《BiSeNet:Bilateral Segmentation Network for Real-time Semantic Segmentation》
  17. 麦克米伦高阶词典三星7500单词
  18. 使用RedisDesktopManager无法连接Redis服务器问题
  19. 谈谈绘画为什么要重视画人物肖像?
  20. 功能核磁共振成像资料分享汇总

热门文章

  1. Amoeba for MySQL
  2. eclipse Android 开发基础 Activity 窗体 界面
  3. HDTV(1920x1080)码率和视频质量关系的研究 2 (实验结果)
  4. (转)创建X509证书,并获取证书密钥的一点研究
  5. 安卓APP_ 控件(8)—— AlertDialog
  6. python 清屏_Python学前准备如果你知道要去哪,那么全世界都给你让路
  7. js对象数组转java对象数组对象数组对象数组对象,前台js数组json字符串,后台json转为对象数组的具体实现...
  8. Mac idea使用Command + p 快捷键查看一个类的构造函数需要传入什么参数
  9. linux的less命令如何退出,Linux命令详解之less命令
  10. 计算机网络基础:ISO/OSI网络体系结构知识笔记​