zoukankan      html  css  js  c++  java
  • onDraw调用和android中Invalidate和postInvalidate的区别

    onDraw是在View初化完成之后开始调用
    postInvalidate()是重绘的,也就是调用postInvalidate()后系统会重新调用onDraw方法画一次,
    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的:

        public void
    postInvalidate() {
                postInvalidateDelayed(0);
        }

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

  • 相关阅读:
    Linux下通过Generic Binaries安装MySQL 5.5
    struts 2 中AJAX的使用及Struts 2 JSON的使用
    关于Abstract interface的问题。
    对于“Win8对开发者的影响”的一些看法
    RealtimeModifier Bug Report | RealtimeModifier Bug 反馈
    何为Tomcat内存
    SSH开发过程中的中文问题汇总
    Spring Test 整合 JUnit 4 使用总结
    创建Shell脚本方便MySQL服务端启动
    学习笔记 winForm move功能 与 drag 功能
  • 原文地址:https://www.cnblogs.com/wangxianzhen/p/3011139.html
Copyright © 2011-2022 走看看