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的:
  1. public void postInvalidate() {
  2.         postInvalidateDelayed(0);
  3. }

  4. public void postInvalidateDelayed(long delayMilliseconds) {
  5.         // We try only with the AttachInfo because there's no point in invalidating
  6.         // if we are not attached to our window
  7.         if (mAttachInfo != null) {
  8.             Message msg = Message.obtain();
  9.             msg.what = AttachInfo.INVALIDATE_MSG;
  10.             msg.obj = this;
  11.             mAttachInfo.mHandler.sendMessageDelayed(msg, delayMilliseconds);
  12.         }
  13.     }



除了onCreate()是运行在UI线程上的,其实其他大部分方法都是运行在UI线程上的,其实其实只要你没有开启新的线程,你的代码基本上都运行在UI线程上。
【Android面试八股文】你来讲一讲invalidate() 和 postInvalicate() 的区别 当涉及到 Android 中的 View 刷新时,和都是常用的方法。 阅读详情

相关推荐

HDMI设计6--Video PHY Controller IP

Reference:https://china.xilinx.com/content/dam/xilinx/support/documentation/ip_documentation/vid_phy_controller/v2_2/pg230-vid-phy-controller.pdf 1. 序 Video PHY Controller IP是为实现与视频(DisplayPort和HDMI™技术)MAC传输或接收子系统的即插即用连接而设计的。视频MAC层和PHY层的接口是标准化的,能...

Archar_Saber的博客 8338

Android invalidate、requestLayout

invalidate()方法的使用,就是重新触发一次View的绘制流程。入口在View类中, public void invalidate() { invalidate(true); } public void invalidate(boolean invalidateCache) { invalidateInternal(0, 0, mRight - mLeft, mBottom - mTop, invalidateCache, true); } 在 invalidateI...

zenmela2011的专栏 4241

ERPS协议原理

目录 1、ERPS概述: 2、ERPS名词概念解释: 3、ERPS协议报文: 4、ERPS单环基本原理: 5、单环多实例原理: 6、多环原理: 1、ERPS概述: ERPS(Ethernet Ring Protection Switching),即以太网多环保护技术,是ITU-T定义的一种二层破环协议标准,标准号为ITU-T G.8032/Y1344,因此又称为G.8032。它定义了RAPS(Ring Auto Protection Switching)协议报文和保护倒换机制。 ERPS目前支持v1和v2两

weixin_44880796的博客 1万+

Android invalidate() postInvalidate()

请注意,如果视图需要在其尺寸、位置或可见性改变时自动重绘自身,通常应当调用 `invalidate()` 而不是 `postInvalidate()`。具体来说,当你需要更新视图的显示状态,但又不希望立即阻塞UI线程时,使用 `postInvalidate()` 方法是非常合适的。例如,在动画或者数据模型发生变化后,视图可能需要重新绘制以反映新的状态,这时调用这个方法就会触发视图内容的重新布局和绘制。不过通常情况下,对于标准的属性动画,系统会在内部自动处理视图的重绘,不需要开发者手动调用。

weixin_34991050的博客 673

手把手教你解决COLMAP编译中的Ceres CUDA支持问题(附详细配置步骤)

本文详细解析了COLMAP编译中Ceres CUDA支持问题的完整解决方案,包括环境准备、Ceres Solver的CUDA编译配置、COLMAP的CUDA集成配置等关键步骤。通过优化CMake参数和解决常见错误,帮助技术人员充分利用GPU加速优势,提升三维重建效率。

vodka的博客 858

【RKNN】RKNN(Rockchip Neural Network)​​ 的详解

RKNN 为 Rockchip 硬件提供了高效的 AI 推理解决方案,适合需要低功耗、实时响应的边缘场景

浩瀚之水的专栏 1684

android 谈谈invalidate和postInvalidate方法的区别

看这二个方法的区别只有深入到代码中去看了,首先看invalidate()方法 invalidate()分析 public void invalidate() { invalidate(true); } 然后到 void invalidateInternal(int l, int t, int r, int b, boolean invalidateCache...

zhouguizhi 694

使用rknn进行facenet部署

修改facenet网络的forward函数代码。

如果想成为中心,那么就到中心去吧。 1044

Android中invalidate()和postInvalidate() 的区别

Android提供了Invalidate方法实现界面刷新,但是Invalidate不能直接在线程中调用,因为他是违背了单线程模型:Android UI操作并不是线程安全的,并且这些操作必须在UI线程中调用。  invalidate()是用来刷新View的,必须是在UI线程中进行工作。比如在修改某个view的显示时,调用invalidate()才能看到重新绘制的界面。invalidate()的

小地盘的诺克萨斯 730

RT-DETR改进策略【损失函数篇】| 2024 引进Focaler-IoU损失函数 加强边界框回归 (Focaler-DIoU、Focaler-GIoU、Focaler-CIoU等)

本文记录的是改进RT-DETR的损失函数,将其替换成。现有研究通过利用边界框之间的几何关系来提高回归性能,但忽略了困难样本和简单样本分布对边界框回归的影响。不同检测任务中困难样本和简单样本的分布不同,对于简单样本占主导的检测任务,关注简单样本的边界框回归有助于提高检测性能;对于困难样本比例较高的检测任务,需要关注困难样本的边界框回归。,提高检测器在不同检测任务中的性能。实现的。

Limiiiing的博客 1922

低功耗设计:如何计算power switch的数量?

power switch加多了漏电高,加少了ir drop会有问题,具体加多少合适要如何计算呢?这里可以给一个参考方式。 第一步,先选switch cell的类型 通常选用HVT类型的switch cell,优点是漏电更低,缺点也很明显,电阻大,压降也大,switch cell的大小选择,可以选择(开启电阻x面积)最小的switch cell,即单位面积提供最小并联电阻的cell类型。 第二步,计算数量 选好类型,确定了开启电阻,可以按照如下公式计算数量: Ron/Xnum • W/V = V•P

m0_61544122的博客 3570

Android --- android中Invalidate和postInvalidate的区别

Android中实现view的更新有两组方法,一组是invalidate,另一组是postInvalidate,其中前者是在UI线程自身中使用,而后者在非UI线程中使用。 Android提供了Invalidate方法实现界面刷新,但是Invalidate不能直接在线程中调用,因为他是违背了单线程模型:Android UI操作并不是线程安全的,并且这些操作必须在UI线程中调用。   Android程序中可以使用的界面刷新方法有两种,分别是利用Handler和利用postInval...

梁同学与Android 1036

Qt —— 在Win11下“Qt for Android“开发环境,通过USB在真机(华为Meta60 PRO)上调试运行,并打包APK并在真实手机运行

Qt —— 在Win11下“Qt for Android“开发环境,打包APK并在真实手机运行

311

Android自定义View之invalidate和postInvalidate方法的区别

我们在自定义View时免不了要使用invalidate方法,这个方法的作用大家也比较清楚,就是让我们的View进行刷新重新绘制的。但是postInvalidate方法可能就不是那么熟悉了,因为平时开发时invalidate方法相对而言会用得比较多。不过需要大家注意的是,面试官在问到View相关的问题时,就很有可能会问到postInvalidate方法,所以我们还是有必要来学习一下。 那inval...

AntDream的程序世界 1674

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

invalidate函数android,Android中View绘制流程以及invalidate()等相关方法分析

requestLayout()方法说明 :对View树重新布局layout过程,draw()过程,但不会重新绘制任何视图包括该调用者本身。一般引起invalidate()操作的函数如下:1、setVisibility()方法 :当View的可视状态在INVISIBLE / VISIBLE 转换为 GONE状态时,会间接调用requestLayout() 和invalidate方法。同时,由于整个个...

weixin_36212560的博客 699

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

弄清楚Android invalidate、postInvalidate、requestLayout作用

3、对于硬件加速绘制来说,通过绘制标记控制需要重绘的View,因此当我们调用view.invalidate()时,该view被设置了重绘标记,在Draw过程里该view draw(xx)被调用。试想一下,假设View的尺寸改变了,变大了,那么调用了requestLayout后因为走了Measure、Layout 过程,测量、摆放倒是重新设置了,但是不调用Draw出不来效果啊。颜色改变后,需要重新执行onDraw(xx)才能看到改变后的效果,通过invalidate()方法触发onDraw(xx)调用。

Dream It Possible 855

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

Android invalidate/postInvalidate/requestLayout 彻底厘清

前言 前几篇分析了Measure、Layout、Draw 过程,这三个过程在第一次展示View的时候都会调用。那之后更改了View的属性呢?比如更改颜色、更换文字内容、更换图片等,还会走这三个过程吗?循着这个思路,来分析Invalidate/RequestLayout流程。 通过本篇文章,你将了解到: 1、Invalidate 流程 2、RequestLayout 流程 3、Invalidate/RequestLayout 使用场合 4、子线程真不能绘制UI吗 5、postInvalidate 流程 I

1928

Android invalidate、postInvalidate、requestLayout的区别

invalidate方法用于在UI线程中请求重绘视图。当我们希望在主线程中更新UI时,可以在UI线程中直接调用invalidate()方法。内部实现:调用了invalidate方法后,为该View添加一个标记位,同时不断向父容器请求刷新,父容器通过计算得出自身需要重绘的区域,直到传递到ViewRootImpl中,最终触发performTraversals方法,开始View树重绘流程(只绘制需要重绘的视图)

weixin_40323532的博客 1773

Android中invalidate() 函数详解(结合Android 4.0.4 最新源码)

invalidate()函数的主要作用是请求View树进行重绘,该函数可以由应用程序调用,或者由系统函数间接调用,例如setEnable(), setSelected(), setVisiblity()都会间接调用到invalidate()来请求View树重绘,更新View树的显示。       注:requestLayout()和requestFocus()函数也会引起视图重绘

zjmdp的专栏 4万+

android invalidate 执行流程详解

invalidate()函数的主要作用是请求View树进行重绘,该函数可以由应用程序调用,或者由系统函数间接 调用,例如setEnable(), setSelected(), setVisiblity()都会间接调用到invalidate()来请求View树重绘,更新View树的显示。      注:requestLayout()和requestFocus()函数也会引起视图重绘       下...

weixin_33976072的博客 804

Android View刷新:invalidate和postInvalidate详解

Android中invalidate()和postInvalidate()都是触发View重绘的方法,主要区别在于线程安全性:invalidate()只能在UI线程调用,直接触发重绘;postInvalidate()可在任意线程调用,通过Handler将重绘任务发送到UI线程执行。使用时,UI线程内直接调用invalidate(),子线程中优先使用postInvalidate(),也可通过Handler配合invalidate()实现。两者都会触发当前View及其父View的递归重绘,不存在"仅重

m0_74296492的博客 602

设置wsl2桥接模式和设置ip

wsl2在使用时因为网络问题导致使用及其不方便,而桥接模式恰巧能解决这些痛点,具体实施过程

qq_38836741的博客 1万+

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

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

Mars2639——求知de路上 12万+

Android开发:Invalidate和postInvalidate刷新View的区别及应用-----ImageView绘制旋转圆环(二)...

上文已经实现了圆环旋转,但是很多合格。发现之前对handler Thread Runnable理解的不深,包括如何刷新UI。这次总算清了一下帐,基本搞清除了。Android中实现view的更新有两组方法,一组是invalidate,另一组是postInvalidate,其中前者是在UI线程自身中使用,而后者在非UI线程中使用。参考这里,刷新UI有三种方式:1.不使用多线程和双缓冲 这种情况最简单了...

分享技术干货和灵感 429

Android上让View自动更新的另一种办法(非线程)

<br />以前在让使用View时,如果要更新界面,总是使用到线程来更新界面,但在看了SDK之后,发现APIDemo里没有使用过多线程的,使用的是另一个方法。<br />以前写过一个简单的小游戏,用了View,页面更新的代码如下<br />public void run() { while( drawing ) { try { //更新球的位置信息 update(); //通知系统更新界面,相当于调用了onDraw函数

风清云淡 6436
上一篇: Button或TextView设置drawableLeft图片(左图标)
下一篇: Android添加工程时出现This template depends on the Android Support library
biandroid
博客等级 码龄15年 3粉丝 132原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值