android中Invalidate和postInvalidate的更新view区别

昨日未半生

昨日未半生

2016-02-19 10:58

今天图老师小编给大家展示的是android中Invalidate和postInvalidate的更新view区别,精心挑选的内容希望大家多多支持、多多分享,喜欢就赶紧get哦!
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线程上。
展开更多 50%)
分享

猜你喜欢

android中Invalidate和postInvalidate的更新view区别

编程语言 网络编程
android中Invalidate和postInvalidate的更新view区别

Android 通过onDraw实现在View中绘图操作的示例

编程语言 网络编程
Android 通过onDraw实现在View中绘图操作的示例

s8lol主宰符文怎么配

英雄联盟 网络游戏
s8lol主宰符文怎么配

SlideOver、Split View和画中画的区别

手机软件 应用软件
SlideOver、Split View和画中画的区别

Android View添加 Listener 实例代码

编程语言 网络编程
Android View添加 Listener 实例代码

lol偷钱流符文搭配推荐

英雄联盟 网络游戏
lol偷钱流符文搭配推荐

Android 自定义View的使用介绍

编程语言 网络编程
Android 自定义View的使用介绍

Android UI开发 View自绘控件 分享

编程语言 网络编程
Android UI开发 View自绘控件 分享

lolAD刺客新符文搭配推荐

英雄联盟
lolAD刺客新符文搭配推荐

手动清除U盘使用痕迹方法

手动清除U盘使用痕迹方法

JavaScript 经典效果集

JavaScript 经典效果集
下拉加载更多内容 ↓