`

2011.06.21(2)——— android invalidate和postInvalidate

阅读更多
2011.06.21(2)——— android invalidate和postInvalidate

参考:http://www.blogjava.net/gooogle/archive/2008/03/05/184030.html

根据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);
            // 这里处理视图需要更新的代码。
                    
        }
   };

  
  
对于postInvalidate用法来说就相对简单点了直接调用就OK了,这里就不详细说了
分享到:
评论

相关推荐

    2011.09.20(2)——— android sample之snake 触摸操作

    【标题】"2011.09.20(2)——— android sample之snake 触摸操作" 涉及的是一个Android平台上的经典游戏《贪吃蛇》(Snake)的示例项目,主要讲解了如何在Android应用中实现触摸事件的处理。这个项目不仅是一个基础...

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

    总结起来,理解Android中View的绘制流程和`invalidate()`的工作原理对于开发高质量的用户界面至关重要。通过合理利用这些知识,我们可以创建出更加灵活且高效的Android应用。在本Demo中,通过实现画多个圆圈的功能,...

    android自定义veiw——波浪线

    本文将围绕“android自定义view——波浪线”这一主题,深入探讨如何实现这样的自定义组件。 首先,我们了解自定义View的基本步骤。创建一个自定义View通常需要继承自Android的View或其子类,如ViewGroup。在这个...

    android中Invalidate和postInvalidate的更新view区别

    `Invalidate`和`postInvalidate`是Android提供的两种主要的View刷新机制,它们虽然都能达到更新界面的效果,但在使用场景和执行机制上有所区别。 首先,`Invalidate`方法是直接在UI线程中调用的。当调用一个View的`...

    安卓Android源码——特效demo.zip

    【安卓Android源码——特效demo.zip】是一个包含Android平台特效示例代码的压缩包,它为开发者提供了深入了解和学习Android特效实现的宝贵资源。在这个压缩包中,主要的子文件名为"Texiaodemo",这很可能是项目或库...

    安卓Android源码——MoveBackgroundSample.rar

    可能的优化策略包括使用硬件加速、减少不必要的绘制调用、合理使用invalidate()和postInvalidate(),以及适时地暂停和恢复动画。 6. **触摸事件处理**:为了增加交互性,MoveBackgroundSample可能还涉及触摸事件的...

    安卓Android源码——MyRorateViewTest130227.zip

    【标题】"安卓Android源码——MyRorateViewTest130227"是一个针对Android平台自定义视图的示例项目。这个压缩包包含了开发者在2013年2月27日创建的一个名为"MyRorateViewTest"的项目,主要目标是展示如何在Android...

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

    在Android开发中,更新视图(View)是常见的任务,主要通过`invalidate()`和`postInvalidate()`这两个方法来实现。这两个方法都是用来触发View的重绘,但它们的使用场景和机制有所不同。 首先,`invalidate()`方法...

    安卓Android源码——MySeekBar.rar

    开发者需要关注内存管理,避免过度绘制,合理使用缓存,以及在适当的地方使用 `postInvalidate()` 而非 `invalidate()` 来减少不必要的重绘。 通过对 "MySeekBar" 源码的学习,开发者不仅能理解 SeekBar 的工作原理...

    Android动画之——圆形进度条加波浪线

    总的来说,实现"Android动画之——圆形进度条加波浪线"需要深入理解Android的自定义View机制,熟练掌握Canvas和Path的使用,以及对动画系统的运用。通过这个过程,开发者不仅可以提升自己的技能,还能创造出富有创意...

    Android源码——画图工具源码.zip

    - 使用`postInvalidate()`而非`invalidate()`来延迟视图的更新,减少不必要的重绘。 8. **图片资源**: - 文件名中的".png"表示这是PNG图像文件,可能用作画图工具的背景、图标或者其他资源。在Android中,可以...

    分析invalidate流程例子

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

    安卓Android源码——旋转风车.zip

    这个“安卓Android源码——旋转风车.zip”文件提供了一个实现这一效果的示例代码,让我们来深入探讨一下相关知识点。 1. **自定义View** 安卓中的动画效果通常是通过自定义View或者使用系统提供的动画库来实现的。...

    Android源码——风车效果源码_new_76.zip

    3. 使用`postInvalidate()`或`invalidate()`方法来触发重绘,通常在动画更新角度后调用。 4. 创建属性动画,例如使用`ObjectAnimator.ofFloat()`指定动画目标(如风车的旋转角度)并设置动画持续时间、插值器等参数...

    安卓Android源码——换肤.zip

    在这个“安卓Android源码——换肤.zip”中,`Re_Skin1`和`Re_Skin`可能分别代表两个不同的皮肤资源包。解压后,开发者可以查看源代码和资源文件,学习如何组织和切换这些皮肤,以及如何在实际项目中实现类似的功能。...

    浅谈Android invalidate 分析

    1. invalidate 和 postInvalidate 的关系 postInvalidate 是通过 Handler 切换回到主线程,然后在调用 invalidate 的,源码: public void postInvalidate() { postInvalidateDelayed(0); } public void ...

    安卓Android源码——屏幕画笔实现源码.zip

    本压缩包文件"安卓Android源码——屏幕画笔实现源码.zip"包含了关于如何在Android应用中使用画笔进行屏幕绘制的相关资料,主要包括一个图片示例和一份源码说明。 1. Android画笔(Paint)类: Android中的`Paint`...

    百度Android工程师面试题.pdf

    - View的刷新:通过Handler发送消息,然后在Handler中调用`invalidate()`或`postInvalidate()`刷新界面。 - 内存泄露:未关闭的数据库Cursor、未正确使用的Adapter、未回收的Bitmap对象等可能导致内存泄露。使用DDMS...

Global site tag (gtag.js) - Google Analytics