`
panshaobinSB
  • 浏览: 202845 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

Android invalidate

 
阅读更多
原文:http://blog.163.com/gobby_1110/blog/static/2928171520114965337450/  
根据Android SDK api文档说明 invalidate 方法是用来更新视图(View)的方法,不过这东西的用法比较古怪 invalidate 方法如果你直接在主线程中调用,是看不到任何更新的。如果跟线程结合使用的话比如在下面的代码中就会抛出异常 UIThread implements Runnable{ public voi
  
  根据Android SDK api文档说明
invalidate 方法是用来更新视图(View)的方法,不过这东西的用法比较古怪
invalidate 方法如果你直接在主线程中调用,是看不到任何更新的。
如果跟线程结合使用的话
比如在下面的代码中就会抛出异常

UIThread implements Runnable{
public void run(){
  invalidate();
  }
}
  上面的代码会抛出Only the original thread that created a view hierarchy can touch its views。
  怎么样解决上面的问题呢,如果你有两个View,你需要一个View用来显示当前的状态,一个Thread去下载网络数据
  或者是读取文件等,这些数据读取完毕后你要更新View到当前屏幕上怎么办呢。看看下面的代码,也许可以帮助你

  第一种解决方案是:
class UIUpdateThread implements Runnable{

            public void run() {
                try {
                    Thread.sleep(1000*5);
                    mHandler.post(mUpdateResults);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
               
            }
           
             final Handler mHandler = new Handler();
                final Runnable mUpdateResults = new Runnable() {
                    public void run() {
                        invalidate(); //更新视图
                    }
                };
           
}
  你必须实现一个Handler.然后再你下载数据的线程中放上一个mHandler.post(mUpdateResults);这样就可以了。

  第2中方案比较简单

LoadDataThread implements Runnable{
public void run(){
   doLoadData();
   mHandler.sendMessage(mHandler.obtainMessage()); //这里系统会自动调用handleMessage;这样就可以更新视图了
   }
}

  Handler mHandler = new Handler(){
        @Override
        public void handleMessage(Message msg) {
            super.handleMessage(msg);
            // 这里处理视图需要更新的代码。
                   
        }
   };
分享到:
评论

相关推荐

    浅谈Android invalidate 分析

    浅谈Android invalidate 分析 Android 系统中的invalidate机制是View树中非常重要的一部分,它负责对View树进行重绘和更新。当我们对View进行修改时,需要调用invalidate方法来触发重绘过程。那么,今天我们就来浅...

    分析invalidate流程例子

    在Android开发中,`Invalidate`是一个至关重要的概念,它涉及到UI更新机制,与用户界面的刷新和重绘紧密相关。当我们对一个View调用`invalidate()`方法时,实际上是触发了该View的重新绘制过程。这个过程涉及到多个...

    Android中invalidate()和postInvalidate() 的区别及使用方法

    Android中实现view的更新有两组方法,一组是invalidate,另一组是postInvalidate,其中前者是在UI线程自身中使用,而后者在非UI线程中使用。  Android提供了Invalidate方法实现界面刷新,但是Invalidate不能直接在...

    Android中View绘制流程以及invalidate()

    本篇文章将深入探讨Android中View的绘制流程以及`invalidate()`方法的工作原理。 首先,我们需要了解Android视图的生命周期,它包括测量(Measure)、布局(Layout)和绘制(Draw)三个主要阶段: 1. **测量阶段(Measure...

    android培训笔记(超详细)

    【Android invalidate()与postInvalidate()用法】 invalidate()方法用于立即重新绘制View,而postInvalidate()则会在UI线程的下一个事件循环中触发重绘。如果需要在非UI线程中更新视图,应使用postInvalidate()。 ...

    invalidate

    "invalidate()方法在Android中的应用和实现" invalidate()方法是Android中的一种常用方法,主要用于刷新View的界面。当View的显示状态发生改变时,需要调用invalidate()方法来重新绘制界面。invalidate()方法的调用...

    Android studio的make Project、clean Project、Rebuild Project

    Sync Project with gradle files:对gradle文件之后,或刷新gradle配置时使用; Make project:只是对项目中新产生或修改过的文件进行一次编译,已经编译过...Invalidate Cache/Restart AndroidStudio:自动生成的项目

    Android中View绘制流程以及invalidate()等相关方法分析

    在Android开发中,View是构建用户界面的基本元素,它的绘制流程和`invalidate()`等相关方法是开发者需要深入理解的关键概念。本文将详细解析Android中View的绘制流程,以及`invalidate()`等核心方法的工作原理。 ...

    Android 实现界面刷新的几种方法

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

    android中Invalidate和postInvalidate的更新view区别

    在Android开发中,更新View是常见的任务,而`invalidate()`和`postInvalidate()`就是用于这一目的的关键方法。这两者都是用来标记一个View为脏(dirty),需要重新绘制,但它们在使用场景和机制上有所不同。 1. `...

    自己做的android迷宫小游戏(基于android2.2)

    在游戏循环中,注意适时调用View的invalidate()方法来触发重绘,以确保游戏画面的流畅更新。 最后,为了提高用户体验,游戏应该具备友好的用户界面和反馈机制。这包括设计吸引人的图形界面,提供清晰的指引和提示,...

    android三种自定义Loading加载框

    protected void on invalidate() { super.onInvalidated(); if (/* 动画结束条件 */) { return; } // 更新currentFrame并再次调用postInvalidateOnAnimation() } } ``` 在布局文件中添加自定义加载框: ...

    android自定义圆盘方向按钮

    5. **invalidate()**:在需要重新绘制时,调用此方法通知系统。比如在触摸事件处理后,或者属性改变时。 接下来,我们可以在布局XML文件中添加这个自定义控件,指定其属性,如大小、颜色等。同时,我们还可以为它...

    Android播放GIF动画源码

    可以使用`setLayerType()`方法设置为Hardware加速,或者在需要时手动调用`invalidate()`。 7. **生命周期管理**:当Activity或Fragment的生命周期发生变化时,需要正确处理GIF动画的暂停和恢复。例如,在onPause()...

    Android实现窗口抖动

    在Android开发中,窗口抖动(Window Jitter)通常指的是用户界面元素在短时间内频繁更新或重绘,导致屏幕上的视图出现不稳定、闪烁或者抖动的现象。这种问题可能会影响用户体验,甚至在某些情况下消耗大量的系统资源...

Global site tag (gtag.js) - Google Analytics