invalidate()和postInvalidate() 的区别及使用-程序员宅基地

技术标签: Android“杂货铺”  View 的刷新  

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


使用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();
}
}
}

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/qq_41405257/article/details/80628639

智能推荐

SpringBoot整合Dubbo遇到的几个坑_dubbo bug serviceannotationbeanpostprocessor:no sp-程序员宅基地

文章浏览阅读6.3k次,点赞2次,收藏2次。一、Bean没有注入到容器中报错 [DUBBO] No Spring Bean annotating Dubbo's2019-03-27 09:01:57.601 INFO 9276 --- [ main] b.f.a.ServiceAnnotationBeanPostProcessor : [DUBBO] BeanNameGenerator bean can't b..._dubbo bug serviceannotationbeanpostprocessor:no spring bean annotating d

.NET代码混淆_.net 混淆-程序员宅基地

文章浏览阅读1k次。本文不提代码开源,只谈代码混淆方法。本文使用的代码混淆器是ConfuserEx,网上可以下载的到。参考博文:开源.net 混淆器ConfuserEx介绍.Net平台开发的应用程序,大多编译之后,在bin/Debug目录下生成很多.dll文件和一个可执行文件.exe。本文就是对这些.dll文件和.exe文件进行混淆,防止反编译。ConfuserEx混淆.dll文件和.exe文件方法不尽相同。方法如下:首先,下载ConfuserEx软件,打开后如下图所示:(一)混淆.dll文件比如混淆..._.net 混淆

计算机英语教学教案模板,英语教学设计模板-程序员宅基地

文章浏览阅读106次。英语教学设计模板编写教案要依据教学大纲和教科书。从学生实际情况出发,精心设计。以下是英语教学设计模板,欢迎参考。英语教学设计模板1Lesson 29教学目标 知识目标:能够进行物品归属的问话与答语,并能根据物体的远近,正确使用this和that。能力目标:能听懂,会说要求的单词和句子情感价值:进一步提高对英语学习的热情,培养更加稳定的学习兴趣。能积极主动地参与课堂活动,在情景对话中大胆开口,主动模...

【qt值输入控件-数值调节控件:QT控件QSpinBox和QDoubleSpinBox 】_左边的控件是 qdial , 右边的控件是 qspinbox 。两者相互关联,转动刻度右边的数字-程序员宅基地

文章浏览阅读325次。QT控件QSpinBox和QDoubleSpinBoxNotes共有属性非共有属性Notes在QWidget 层sizePolicy 在设置布局属性时要多注意,在布局中,此值会影响控件的大小,例如上图设置在水平布局时,容器默认是左对齐此时选择布局后,右侧控件的大小会无法锁定而开始自适应布局大小(一般会变成控件的最小size)。QSpinBox 是整形数据,QDoubleSpinBox 是用于于处理浮点值共有属性两者都有两种槽信号,一种是QString的textChanged(QStri_左边的控件是 qdial , 右边的控件是 qspinbox 。两者相互关联,转动刻度右边的数字

王者荣耀角色注销后我的服务器列表怎么删除,如何注销已经玩过的王者荣耀创建的角色?...-程序员宅基地

文章浏览阅读5.4k次。王者荣耀没有注销角色的功能。如果实在不想要了,可以直接注销账号。注销分为注销当前游戏账号和账号永久注销,步骤如下:一、注销当前游戏账号1、首先打开手机进入主屏幕,找到王者荣耀游戏软件。点击王者荣耀进入游戏登录界面,开始游戏。2、登录成功以后点击右上角的设置。3、进入设置界面以后点击退出登录。或者在游戏开始前,登录页面选择右上角【注销】,即可注销当前账号。注意这个之后还是可以登录的,只是当时注销了,..._王者注销账号怎么消除以前的区

量化交易:创建签名、从okex平台获取ticker数据和k线数据_ticker 量化-程序员宅基地

文章浏览阅读5.7k次。import hashlibimport jsonimport pandas as pdfrom urllib.request import Request, urlopenpd.set_option('expand_frame_repr', False) # 当列太多时不换行def create_trade_sign(params, api_key, secret_key):..._ticker 量化

随便推点

六轴机器人轨迹规划之五次多项式插值_五次多项式轨迹怎么添加中间点-程序员宅基地

文章浏览阅读8.9k次。转:https://blog.csdn.net/jldemanman/article/details/793030211.轨迹规划的定义 轨迹规划(trajectory planning)是运动规划(motion planning)研究的主要内容。运动规划指的是运动插补,在起始点和终止点之间插入中间点序列,实现沿着轨迹的平稳运动。运动控制包含路径规划(path planning)和轨迹规划,路径规..._五次多项式轨迹怎么添加中间点

用中点(Besenham)算法实现椭圆或圆的绘制_c++ 用点绘制一个椭圆-程序员宅基地

文章浏览阅读697次。用中点(Besenham)算法实现椭圆或圆的绘制_c++ 用点绘制一个椭圆

Visual Studio Code安装与使用和常见配置_visual studio code配置-程序员宅基地

文章浏览阅读8.9k次,点赞12次,收藏131次。Visual Studio Code安装与使用和常见配置_visual studio code配置

Matlab如何创建多个Legend(图例)_matlab legend多个图例-程序员宅基地

文章浏览阅读4.8w次,点赞11次,收藏48次。Matlab创建一个Legend非常简单,但是当创建两个甚至多个的时候就会遇到很多麻烦。接下来我们就介绍一下如何在Matlab中创建多个Legend(图例)。_matlab legend多个图例

都2024年了,依然有很多人用着Mastercam9.1,谜之操作。-程序员宅基地

文章浏览阅读742次,点赞9次,收藏7次。使用Mastercam9.1的一大批人,很多都是使用了至少5年,甚至10年以上的老工程师,从Mastercam X的第一个版本那时候开始就想换,但是转换成本太高,你一进去使用,就头痛,原来的界面布局,原来的命令的图标,和现在很多大不同了,很多命令的使用结果是一样的,但是使用过程都不是9.1里面的那样了。但是,很多低端玩家,宁愿买个电脑,做十几次系统,也要安装mc。Mastercam9.1版本出来已经好久了,之前还有过6.0, 6.1, 7 ,7.1 ,7.2, 8.0 ,8.1 ,9.0这些版本。_mastercam9.1

网桥bridge-程序员宅基地

文章浏览阅读205次。1. 网桥基础什么是网桥网桥将多个网络在数据链路层连接起来。网桥的前身是集线器或中继器。网桥和集线器的区别:集线器上各端口都是共享同一条背板总线的,网桥的两个端口分别有一条独立的交换信道,不是共享一条背板总线,可隔离冲突域。Linux下的bridge,工作于数据链路层,对下层而言是一个桥设备,进行数据的转发;对上层而言,它就像普通的ethernet设备一样,有自己的IP和MAC地址,上层可以..._只知道一个网桥软件包的前缀是“bridge”,现在需要查询到这个网桥软件包并且安装

推荐文章

热门文章

相关标签