zoukankan      html  css  js  c++  java
  • invalidate()和postInvalidate()的使用与区别

      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()刷新界面

     1 使用postInvalidate则比较简单,不需要handler,直接在工作线程中调用postInvalidate即可。 
     2 
     3 class GameThread implements Runnable {
     4     public void run() {
     5         while (!Thread.currentThread().isInterrupted()) {
     6         try {
     7             Thread.sleep(100);
     8         } catch (InterruptedException e) {
     9         Thread.currentThread().interrupt();
    10         }
    11 
    12         // 使用postInvalidate可以直接在工作线程中更新界面
    13         mGameView.postInvalidate();
    14         }
    15     }
    16 }
  • 相关阅读:
    Oracle中快速查找锁与锁等待
    Oracle查看、修改连接数
    内置数据类型
    代码片段一
    设计模式学习四:依赖倒置原则
    队列
    设计模式学习六:代理模式
    linux 自学系列:一直kill掉多个进程
    设计模式学习五:装饰器模式
    通过__metaclass__为类动态增加方法实例
  • 原文地址:https://www.cnblogs.com/huaqing-wkc/p/4940378.html
Copyright © 2011-2022 走看看