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 }
  • 相关阅读:
    单例模式
    建造者模式
    工厂方法模式
    原型模式
    适配器模式
    桥接模式
    装饰模式
    组合模式
    多线程的学习与GDI的学习
    我们复习.Net的这些日子里
  • 原文地址:https://www.cnblogs.com/huaqing-wkc/p/4940378.html
Copyright © 2011-2022 走看看