http://shazhuzhu1.iteye.com/blog/971193
android中实现view的更新有两组方法,一组是invalidate,另一组是postInvalidate,其中前者是在UI线程自身中使用,而后者在非UI线程中使用。
Android提供了Invalidate方法实现界面刷新,但是Invalidate不能直接在线程中调用,因为他是违背了单线程模型:Android UI操作并不是线程安全的,并且这些操作必须在UI线程中调用。
Android程序中可以使用的界面刷新方法有两种,分别是利用Handler和利用postInvalidate()来实现在线程中刷新界面。
利用invalidate()刷新界面
实例化一个Handler对象,并重写handleMessage方法调用invalidate()实现界面刷新;而在线程中通过sendMessage发送界面更新消息。
-
newThread(newGameThread()).start();、
-
-
HandlermyHandler=newHandler(){
-
-
publicvoidhandleMessage(Messagemsg){
-
switch(msg.what){
-
caseActivity01.REFRESH:
-
mGameView.invalidate();
-
break;
- }
-
-
super.handleMessage(msg);
- }
- };
-
classGameThreadimplementsRunnable{
-
publicvoidrun(){
-
while(!Thread.currentThread().isInterrupted()){
-
Messagemessage=newMessage();
- message.what=Activity01.REFRESH;
-
-
Activity01.this.myHandler.sendMessage(message);
-
try{
-
Thread.sleep(100);
-
}catch(InterruptedExceptione){
- Thread.currentThread().interrupt();
- }
- }
- }
- }
// 在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即可。
- classGameThreadimplementsRunnable{
-
publicvoidrun(){
-
while(!Thread.currentThread().isInterrupted()){
-
try{
-
Thread.sleep(100);
-
}catch(InterruptedExceptione){
- Thread.currentThread().interrupt();
- }
-
- mGameView.postInvalidate();
- }
- }
- }
分享到:
相关推荐
Android中实现view的更新有两组方法,一组是invalidate,另一组是postInvalidate,其中前者是在UI线程自身中使用,而后者在非UI线程中使用,感兴趣的朋友可以了解下哦
Android中实现view的更新有两组方法,一组是invalidate,另一组是postInvalidate,其中前者是在UI线程自身中使用...本文给大家介绍Android中invalidate()和postInvalidate() 的区别及使用方法,感兴趣的朋友一起学习吧
1. invalidate 和 postInvalidate 的关系 postInvalidate 是通过 Handler 切换回到主线程,然后在调用 invalidate 的,源码: public void postInvalidate() { postInvalidateDelayed(0); } public void ...
Invalidate与UpdateWindow区别.doc
在编程的时候经常把UpdateData、Invalidate、InvalidateRect和UpdateWindow四个函数混淆,在这里将简单介绍它们的区别
invalidate()的用法 主要用于刷新
分析invalidate流程例子
本文是系列文章第十篇,讲如何实现下述功能:玩家用手指触摸屏幕来指挥搬运工走动。你将学到的知识内容: 1. 利用回调函数onTouchEvent处理屏幕触摸事件。... 2. 利用invalidate或postInvalidate方法刷新视图。
Invalidate函数及WM_PAINT总结,想必学VC++的都知道这两个东东的作用了!
Invalidate()函数[参考].pdf
vc学习,Invalidate(true),Invalidate(false)2008-08-27 08:13在学一个位图显示程序时,发现了图像显示能不能重绘的问题,当时看了msdn,也在网上看了不少回复。总感觉不是很理解。后来仔细试了一下,有点心得,特写...
串口控件说明: 本程序使用VC6.0的通用串口控件MSCOMM32.OCX来对发送到串口的数据进行采集处理...只要当全局变量中的数值发生变化后就使用函数this->Invalidate()强制重载OnPaint()函数,那么数据图就可以动起来了。
CSharp 4.0 .Net Framework V4.0 Control.Invalidate 方法
但是在根布局上调用 invalidate 或 postInvalidate 不会自动强制子级重新绘制自己。 因此,每个孩子都需要调用 postInvalidate。 ModDataLLParser 可以从活动的 OnCreate 方法实例化。 它应该在视图初始化之后完成...
Android中View绘制流程以及invalidate()等相关方法分析
Android中View控件的Demo,值得学习。实现画多个圆圈的效果。
新建工程 c# 》智能设备 》控件库 public partial class LED : UserControl { bool isonoff; public LED { InitializeComponent ; isonoff false; } [DefaultValue false Description "状态" ...
android 可移动控件 /** * 用于判断view的移动 * @param view * @param event * @return */ @Override public boolean onTouch(View view, MotionEvent event) { final int X = (int) event.getRawX(); ...