当前位置: 首页 > news >正文

Invalidate和postInvalidate的区别

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

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


  Android程序中可以使用的界面刷新方法有两种,分别是利用Handler和利用postInvalidate()来实现在线程中刷新界面。


利用invalidate()刷新界面


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

Java代码



  • // 在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即可。


Java代码



  • 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 NDK环境搭建(Windows环境)
  • 查看Android进程内存资源信息
  • Android NDK学习笔记
  • android常用控件(三)- ProgressBar、ListView
  • 【Android2D游戏开发之二】剖析游戏开发用view还是sarfaceView
  • android中 自定义两个View进行画图,如何让其各自刷新重绘
  • ActivityGroup实现Tab分页标签
  • 自定义Menu(TabMenu)
  • Android上图像处理-倒影,圆角,渐变
  • Activity的任务堆栈学习笔记(一)
  • activity的任务堆栈学习笔记二
  • Android 简史
  • android textview 中超出屏幕宽度的字符 省略号显示
  • 【原创·视频·教程】大话优酷、酷六类视频网站Android端软件开发
  • Android线程相关
  • Idea+maven+scala构建包并在spark on yarn 运行
  • JS进阶 - JS 、JS-Web-API与DOM、BOM
  • node和express搭建代理服务器(源码)
  • passportjs 源码分析
  • SwizzleMethod 黑魔法
  • 测试开发系类之接口自动化测试
  • 从tcpdump抓包看TCP/IP协议
  • 订阅Forge Viewer所有的事件
  • 多线程 start 和 run 方法到底有什么区别?
  • 关于 Linux 进程的 UID、EUID、GID 和 EGID
  • 关于List、List?、ListObject的区别
  • 技术:超级实用的电脑小技巧
  • 前端面试题总结
  • 微服务入门【系列视频课程】
  • 为物联网而生:高性能时间序列数据库HiTSDB商业化首发!
  • 我有几个粽子,和一个故事
  • 学习ES6 变量的解构赋值
  • 与 ConTeXt MkIV 官方文档的接驳
  • hi-nginx-1.3.4编译安装
  • mysql面试题分组并合并列
  • ​LeetCode解法汇总2808. 使循环数组所有元素相等的最少秒数
  • #在 README.md 中生成项目目录结构
  • (C#)if (this == null)?你在逗我,this 怎么可能为 null!用 IL 编译和反编译看穿一切
  • (function(){})()的分步解析
  • (iPhone/iPad开发)在UIWebView中自定义菜单栏
  • (Redis使用系列) Springboot 实现Redis 同数据源动态切换db 八
  • (八)Spring源码解析:Spring MVC
  • (三维重建学习)已有位姿放入colmap和3D Gaussian Splatting训练
  • (正则)提取页面里的img标签
  • ***监测系统的构建(chkrootkit )
  • .NET Conf 2023 回顾 – 庆祝社区、创新和 .NET 8 的发布
  • .NET core 自定义过滤器 Filter 实现webapi RestFul 统一接口数据返回格式
  • .net 反编译_.net反编译的相关问题
  • .NET/C# 的字符串暂存池
  • .NET框架类在ASP.NET中的使用(2) ——QA
  • @RequestBody详解:用于获取请求体中的Json格式参数
  • [1]-基于图搜索的路径规划基础
  • [20150321]索引空块的问题.txt
  • [ajaxupload] - 上传文件同时附件参数值
  • [Angularjs]ng-select和ng-options