onDraw是在View初化完成之后开始调用

postInvalidate()是重绘的,也就是调用postInvalidate()后系统会重新调用onDraw方法画一次,

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

}

}

}

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

}

}

更多相关文章

  1. Android系列之网络(三)----使用HttpClient发送HTTP请求(分别通过GET
  2. AsyncTask学习笔记
  3. Android(安卓)JSON使用(二):解读org.json包
  4. (4.2.3)【android开源工具】Android快速开发系列 10个常用工具类
  5. 拨云见日---android异步消息机制源码分析(二)
  6. android中TextView中文字体粗体的方法 (android:textStyle="bold
  7. Android(安卓)音视频学习系列(一) JNI 从入门到精通
  8. android面试题(1)
  9. Android学习路线(十二)Activity生命周期——启动一个Activity

随机推荐

  1. Android进程保活
  2. Android中如何修改CheckBox的颜色
  3. Android视频教学下载大全(VeryCD上)
  4. ntfs在android平台上的移植
  5. Android之SurfaceView学习
  6. Android(安卓)APK安装过程及原理详解
  7. android Progressbar使用
  8. Android中设置关键字高亮的方法
  9. Android回调——Android模块化编程
  10. Android加载中动画