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

        }

    }





除了onCreate()是执行在UI线程上的,事实上其它大部分方法都是执行在UI线程上的,事实上事实上仅仅要你没有





开启新的线程,你的代码基本上都执行在UI线程上。

android中Invalidate和postInvalidate的差别的更多相关文章

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

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

  2. android中Invalidate和postInvalidate的区别

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

  3. Android中Invalidate与postInvalidate的区别<转>

    http://www.cnblogs.com/it-tomorrow/archive/2012/11/08/2760146.html 示例:http://rayleung.iteye.com/blog ...

  4. Android中@+id和@id的差别

    Android中的组件须要用一个int类型的值来表示.这个值也就是组件标签中的id属性值. id属性仅仅能接受资源类型的值,也就是必须以@开头的值,比如,@id/abc.@+id/xyz等.  假设在 ...

  5. 我的Android进阶之旅------&gt;android中getLocationInWindow 和 getLocationOnScreen的差别

    View.getLocationInWindow(int[] location) 一个控件在其父窗体中的坐标位置 View.getLocationOnScreen(int[] location) 一个 ...

  6. Android界面刷新之invalidate与postInvalidate的区别

    Android的invalidate与postInvalidate都是用来刷新界面的. 在UI主线程中,用invalidate():本质是调用View的onDraw()绘制. 主线程之外,用postI ...

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

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

  8. Android之界面刷新(invalidate和postInvalidate使用)

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

  9. 为何invalidate()不可以直接在UI线程中调用&invalidate与postInvalidate

    1.android ui操作为什么一定要在主线程中执行? 答:Android UI操作是单线程模型,关于UI更新的相关API(包括invalidate())都是按照单线程设计的,对于多线程运行时不安全 ...

随机推荐

  1. phantomjs和selenium模拟登陆qq空间

    # -*- coding: utf-8 -*- from selenium import webdriver import time driver =webdriver.PhantomJS() dri ...

  2. HDU2669 Romantic

    Description The Sky is Sprite. The Birds is Fly in the Sky. The Wind is Wonderful. Blew Throw the Tr ...

  3. noip 2010 三国游戏

    三国游戏 三国游戏 描述 小涵很喜欢电脑游戏,这些天他正在玩一个叫做<三国>的游戏. 在游戏中,小涵和计算机各执一方,组建各自的军队进行对战.游戏中共有N 位武将(N为偶数且不小于4),任 ...

  4. 关于SelectedValue的众多解决方案

    Combox联动效果

  5. md5 加解密

    using JGDJWeb.Model; using System; using System.Collections.Generic; using System.IO; using System.L ...

  6. linux题目整理(一)

    1.Linux如何挂载windows下的共享目录? mount.cifs /IP地址/server/ /mnt/server -O user=administrator password=yourpa ...

  7. 关于JAVA SESSION的小测试

    手生就要多练啊... package com.jeelearning.servlet; import java.io.IOException; import java.io.PrintWriter; ...

  8. Ionic Angular自动捕获错误 配置Angular2.x +

    配置app.module.ts import { Pro } from '@ionic/pro'; // These are the imports required for the code bel ...

  9. windows7_64位安装sql_server_2000成功

    对于4合一的版本来说只要找到安装包里的 STANDARD.PERSONAL.ENTERPRISE.DEVELOPER文件夹下的 X86\SETUP\SETUPSQL.EXE 任何一个运行即可,(理论上 ...

  10. Tomcat服务器与HTTP协议

    Tomcat服务器与HTTP协议 一.  Tomcat服务器 1.tomcat服务器 1.web :网页,它代表的是网络上的资源.(java技术开发动态的web资源,即动态web页面,在Java中,动 ...