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

 更新时间:2016年05月03日 15:42:12   作者:小破孩123  
Android中实现view的更新有两组方法,一组是invalidate,另一组是postInvalidate,其中前者是在UI线程自身中使用,而后者在非UI线程中使用。本文给大家介绍Android中invalidate()和postInvalidate() 的区别及使用方法,感兴趣的朋友一起学习吧

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

      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(); 
} 
} 
} 
} 
// 在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(); 
} 
} 
}

以上所述是小编给大家分享的Android中invalidate()和postInvalidate() 的区别及使用方法,希望对大家有所帮助!

相关文章

  • 解析Android框架之Volley源码

    解析Android框架之Volley源码

    我们知道Volley是在2013年Google I/O大会上推出了一个新的网络通信框架,他的设计目的就是为了那些请求数据量不是特别大,但是又是特别频繁的网络操作非常适合。但是对于数据量较大的请求,比如说下载一个较大的文件,Volley可能相比于其他的框架,就有点不足了。
    2021-06-06
  • Android 按指定大小读取图片的实例

    Android 按指定大小读取图片的实例

    本文主要介绍Android 按指定大小读取图片,在Android开发过程中经常会遇到图片超过屏幕,或者图片过小问题,这里给一个实例解决读取图片大小的问题,希望能帮助有需要的小伙伴
    2016-07-07
  • Android中Activity的生命周期探讨

    Android中Activity的生命周期探讨

    这篇文章主要介绍了Android中Activity的生命周期探讨,本文同时讲解了销毁Activity、暂停与恢复、停止与重启Activity等内容,需要的朋友可以参考下
    2014-10-10
  • Android中判断屏幕是否亮屏和是否解锁功能

    Android中判断屏幕是否亮屏和是否解锁功能

    这篇文章主要介绍了Android中判断屏幕是否亮屏和是否解锁功能,需要的朋友可以参考下
    2017-02-02
  • Android StickListView实现悬停效果

    Android StickListView实现悬停效果

    这篇文章主要介绍了Android StickListView实现悬停效果的相关资料,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2016-06-06
  • android开发教程之实现滑动关闭fragment示例

    android开发教程之实现滑动关闭fragment示例

    这篇文章主要介绍了android实现滑动关闭fragment示例,需要的朋友可以参考下
    2014-03-03
  • Android开发之ContentProvider的使用详解

    Android开发之ContentProvider的使用详解

    本篇文章介绍了Android开发之ContentProvider的使用详解。需要的朋友参考下
    2013-04-04
  • Android开发之ImageLoader使用详解

    Android开发之ImageLoader使用详解

    这篇文章主要介绍了Android开发之ImageLoader使用详解的相关资料,需要的朋友可以参考下
    2016-01-01
  • Android开发之日历CalendarView用法示例

    Android开发之日历CalendarView用法示例

    这篇文章主要介绍了Android开发之日历CalendarView用法,简单分析了日历CalendarView组件的功能、属性设置方法、界面布局、事件监听等相关操作技巧,需要的朋友可以参考下
    2019-03-03
  • Android自定义控件的步骤

    Android自定义控件的步骤

    今天小编就为大家分享一篇关于Android自定义控件的步骤,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
    2018-12-12

最新评论