博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Android笔记:invalidate()和postInvalidate() 的区别及使用——刷新ui
阅读量:5292 次
发布时间:2019-06-14

本文共 1677 字,大约阅读时间需要 5 分钟。

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发送界面更新消息。 

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

 

使用postInvalidate()刷新界面
    使用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 }

 

转载于:https://www.cnblogs.com/zl1991/p/5166094.html

你可能感兴趣的文章
ubuntu 16.04 开机脚本
查看>>
 VS2012 C#调用C++ dll
查看>>
TCL:表格(xls)中写入数据
查看>>
SQL SERVER 2005中如何获取日期(一个月的最后一日、一年的第一日等等)
查看>>
django 学习笔记(转)
查看>>
控制台程序秒变Windows服务(Topshelf)
查看>>
字节流与字符流的区别详解
查看>>
20141026--娱乐-箱子
查看>>
自定义分页
查看>>
Oracle事务
查看>>
任意输入10个int类型数据,把这10个数据首先按照排序输出,挑出这些数据里面的素数...
查看>>
String类中的equals方法总结(转载)
查看>>
图片问题
查看>>
bash使用规则
查看>>
AVL数
查看>>
第二章练习
查看>>
ajax2.0
查看>>
C#时间截
查看>>
C语言程序设计II—第九周教学
查看>>
C# 获取系统时间及时间格式转换
查看>>