android中Invalidate和postInvalidate的更新view区别

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

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

Android程序中可以使用的界面刷新方法有两种,分别是利用invalidate和利用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();

}

}

}

View 类中postInvalidate()方法源码如下,可见它也是用到了handler的:

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);

}

}

除了onCreate()不是运行在UI线程上的,其实其他大部分方法都是运行在UI线程上的,其实只要你没有开启新的线程,你的代码基本上都运行在UI线程上。

时间: 2024-10-25 15:09:58

android中Invalidate和postInvalidate的更新view区别的相关文章

android中Invalidate和postInvalidate的更新view区别_Android

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

Android中invalidate()和postInvalidate() 的区别及使用方法_Android

Android中实现view的更新有两组方法,一组是invalidate,另一组是postInvalidate,其中前者是在UI线程自身中使用,而后者在非UI线程中使用.       Android提供了Invalidate方法实现界面刷新,但是Invalidate不能直接在线程中调用,因为他是违背了单线程模型:Android UI操作并不是线程安全的,并且这些操作必须在UI线程中调用. invalidate()是用来刷新View的,必须是在UI线程中进行工作.比如在修改某个view的显示时,调

Android中invalidate()和postInvalidate() 的区别及使用方法

Android中实现view的更新有两组方法,一组是invalidate,另一组是postInvalidate,其中前者是在UI线程自身中使用,而后者在非UI线程中使用. Android提供了Invalidate方法实现界面刷新,但是Invalidate不能直接在线程中调用,因为他是违背了单线程模型:Android UI操作并不是线程安全的,并且这些操作必须在UI线程中调用. invalidate()是用来刷新View的,必须是在UI线程中进行工作.比如在修改某个view的显示时,调用inval

Android 中ViewPager重排序与更新实例详解

Android 中ViewPager重排序与更新实例详解 最近的项目中有栏目订阅功能,在更改栏目顺序以后需要更新ViewPager.类似于网易新闻的频道管理. 在重新排序之后调用了PagerAdapter的notifyDataSetChanged方法,发现ViewPager并没有更新,于是我开始跟踪源码,在调用PagerAdapter的notifyDataSetChanged方法后,会触发Viewpager的dataSetChanged方法. void dataSetChanged() { //

android中的动画可以改变一个view的高和宽吗?

问题描述 android中的动画可以改变一个view的高和宽吗? 简单点说把,就是在android中通过动画可以改变这个对象的高度和宽度吗?举个例子,现在有一个图片,是imageview,我可不可以给他做一个动画让他高度变大?这个变大是指他实际占用的位置,比如这个imagview我在xml里配置的是200dip,通过动画我可以让他再动画结束后的高度变成500dip吗? 解决方案 类似效果,你的动画改变view布局参数,应该对imageView应用新的布局参数. 创建应用新布局参数(lp)的自定义

缓存-android中请求json数据出现更新不及时的问题

问题描述 android中请求json数据出现更新不及时的问题 我向服务器请求json数据,返回的数据中有个请求次数,发现短时间内请求次数不变(服务器那边的数据已经变了),要过一段时间,或者重启一下应用返回的请求次数才会改变,请问这是缓存的原因吗?如何解决 解决方案 不是,应该是数据接收有问题. 解决方案二: 你是说服务器端数据不变,还是android返回的数据不变, 觉得你要检查一下你的API接口,是否真的调用,数据库是否真的更新了,这个肯定会变的 解决方案三: 你这个 会缓存吗? 不是没一次

android中方法setContentView和方法findViewById的区别和联系是什么

问题描述 android中方法setContentView和方法findViewById的区别和联系是什么 android中方法setContentView和方法findViewById的区别和联系是什么 解决方案 前者是设置文本属性,后者是用来获取ID号. 解决方案二: setContentView()传入的 是一个layout文件,用来设置布局文件findViewByID用来绑定控件,传入的是一个id 解决方案三: setContentView是用来设置内容布局的.findViewById用

android中这两种方法有什么区别和联系的问题?????

问题描述 android中这两种方法有什么区别和联系的问题????? startService(Intent)/bindService(Intent):来启动一个Service 这两种方法有什么区别和联系 解决方案 详细参考

单击事件 选中事件-android中单击事件和选中事件的区别

问题描述 android中单击事件和选中事件的区别 我刚开始学android编程,对一些基本概念不熟悉,在看<疯狂android讲义>时经常看到书上有单击事件和选中事件的概念.例如: 在讲网格视图时,书上说要添加列表项被选中的监听器,其设置监听器函数是setOnItemSelectedListener,同时还要添加被单击的监视器,其设置监听器的函数是setOnItemClickListener. 我不是很清楚在手机触摸屏上对列表项进行什么操作算是选中,什么操作又是单击,希望各位能指点下,谢谢了