Android的invalidate与postInvalidate都是用来刷新界面的。

在UI主线程中,用invalidate();本质是调用View的onDraw()绘制。

主线程之外,用postInvalidate()。

用法区别在于:

  1)invalidate():实例化一个Handler对象,并重写handleMessage方法调用invalidate()实现界面刷新;而在线程中通过sendMessage发送界面更新消息。

  1. // 在onCreate()中开启线程
  2. new Thread(new GameThread()).start();
  3.  
  4. // 实例化一个handler
  5. Handler myHandler = new Handler() {
  6.   // 接收到消息后处理
  7.   public void handleMessage(Message msg) {
  8.     switch (msg.what) {
  9.       case Activity01.REFRESH:
  10.         mGameView.invalidate(); // 刷新界面
  11.         break;
  12.     }
  13.  
  14.     super.handleMessage(msg);
  15.   }
  16. };
  17.  
  18. class GameThread implements Runnable {
  19.   public void run() {
  20.     while (!Thread.currentThread().isInterrupted()) {
  21.       Message message = new Message();
  22.       message.what = Activity01.REFRESH;
  23.       // 发送消息
  24.       Activity01.this.myHandler.sendMessage(message);
  25.       try {
  26.         Thread.sleep(100);
  27.       } catch (InterruptedException e) {
  28.         Thread.currentThread().interrupt();
  29.       }
  30.     }
  31.   }
  32. }

  2)使用postInvalidate则比较简单,不需要handler,直接在线程中调用postInvalidate即可

  1. class GameThread implements Runnable {
  2.   public void run() {
  3.     while (!Thread.currentThread().isInterrupted()) {
  4.       try {
  5.         Thread.sleep(100);
  6.       } catch (InterruptedException e) {
  7.         Thread.currentThread().interrupt();
  8.       }
  9.  
  10.       // 使用postInvalidate可以直接在线程中更新界面
  11.       mGameView.postInvalidate();
  12.     }
  13.   }
  14. }

Android界面刷新之invalidate与postInvalidate的区别的更多相关文章

  1. Android界面刷新方法

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

  2. Android中刷新Invalidate和postInvalidate的区别

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

  3. Android笔记:invalidate()和postInvalidate() 的区别及使用——刷新ui

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

  4. Android笔记:invalidate()和postInvalidate() 的区别及使用

    http://blog.csdn.net/mars2639/article/details/6650876 Android提供了Invalidate方法实现界面刷新,但是Invalidate不能直接在 ...

  5. 【Android】android中Invalidate和postInvalidate的区别

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

  6. Android invalidate() 和 postInvalidate()的区别

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

  7. android中Invalidate和postInvalidate的区别

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

  8. Android界面刷新

    Android的invalidate与postInvalidate都是用来刷新界面的,用法区别在于: 1)invalidate():实例化一个Handler对象,并重写handleMessage方法调 ...

  9. invalidate()和postInvalidate() 的区别及使用

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

随机推荐

  1. Java简单的系统登陆

    class Check{ public boolean validate(String name,String password){ if(name.equals("lixinghua&qu ...

  2. C# Bridge Pattern(Handle/Body)

    /* ---------------------------------------------------------------------------- * This file was auto ...

  3. Brew Command Not Found

    安装了brew后,居然找不到brew命令.于是uninstall后再次install,居然还是Brew Command Not Found. 解决办法: http://stackoverflow.co ...

  4. MagicalRecord简单使用小记

    一般采用pod安装,导入框架 #import <CoreData+MagicalRecord.h> - (BOOL)application:(UIApplication *)applica ...

  5. python 多线程学习

    多线程(multithreaded,MT),是指从软件或者硬件上实现多个线程并发执行的技术 什么是进程? 计算机程序只不过是磁盘中可执行的二进制(或其他类型)的数据.它们只有在被读取到内存中,被操作系 ...

  6. live555在Raspberry Pi上的点播/直播

    1.live555在Raspberry Pi上的点播 live555MediaServer这个实例是个简单的服务器,支持多媒体点播,直接在Raspberry Pi上编译运行,或者通过交叉编译出ARM核 ...

  7. Why is applicationhost.config still being added to source control even thought it's in gitignore

      Why is applicationhost.config still being added to source control even thought it's in gitignore g ...

  8. C# 向IQueryable添加一个Include扩展方法

    using System; using System.Data.Objects; using System.Linq; namespace OutOfMemory.Codes { /// <su ...

  9. springmvc的form标签

    1.要使用Spring MVC提供的表单标签,首先需要在视图页面添加: <%@ taglib prefix="form" uri="http://www.sprin ...

  10. c语言中time相关函数

    工作中遇到的函数: int seed = time(NULL); srand(seed); signal(SIGINT, stop); signal(SIGUSR1, sig_usr1); 搜time ...