`
crazier9527
  • 浏览: 1008652 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

Android 的invalidate 与postInvalidate的用法

阅读更多

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

分享到:
评论
1 楼 winerdaxian 2011-08-24  
不错,给力

相关推荐

    android中Invalidate和postInvalidate的更新view区别

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

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

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

    分析invalidate流程例子

    当`invalidate()`的请求被处理时,会触发`onDraw()`回调,但这不是立即发生的,因为Android使用了一种称为`Choreographer`的框架来管理帧率,确保UI更新与屏幕刷新同步。`Choreographer`会在每个VSYNC信号到来时检查...

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

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

    浅谈Android invalidate 分析

    那么,为什么需要使用postInvalidate方法呢?这是因为invalidate方法只能在主线程中调用,而postInvalidate方法可以在任何线程中调用。 接下来,让我们讨论一下子线程是否可以更新UI的问题。答案是可以的。在...

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

    Android程序中可以使用的界面刷新方法有两种,分别是利用Handler和利用postInvalidate()来实现在线程中刷新界面。 利用Handler刷新界面 实例化一个Handler对象,并重写handleMessage方法调用invalidate()实现界面...

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

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

    Android中刷新界面的二种方法

    在Android开发中,更新UI是常见的任务,但为了遵循Android的单线程模型,所有与用户界面相关的操作都必须在主线程(UI线程)中执行。这是因为Android系统为了保证界面操作的一致性和线程安全,规定了UI操作不能在...

    Android自定义带圆点的半圆形进度条

    本例展示了如何使用Android中的自定义View来实现带圆点的半圆形进度条,并且详细介绍了自定义View的基本结构、进度条的绘制、圆点的绘制、进度条的更新、Invalidate和postInvalidate的区别、自定义属性的使用和...

    最新_互联网公司招聘_笔试_开发_百度Android工程师面试题.pdf

    View 的刷新使用 handle.sendMessage 发送信息,然后在 handle 的 getMessage 里面执行 invalidate 或者 postInvalidate。GC 内存泄露的出现情况包括数据库的 cursor 没有关闭、构造 adapter 时没有使用缓存 ...

    android培训笔记(超详细)

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

    android拖动小球demo

    当小球位置发生变化时,需要调用`invalidate()`或`postInvalidate()`方法通知系统进行重绘。`onDraw()`方法会在下一帧合适的时间被调用,重新绘制小球的新位置。 3. **Canvas与Paint对象**: `Canvas`是用于在指定...

    android 自定义控件 小球圆周运动

    - 每个帧的更新中,增加小球的角度,然后根据新的角度计算位置,并调用`invalidate()`方法触发重新绘制。 4. **动画与帧率控制** - Android的动画可以通过`postInvalidate()`或`Handler`来实现。在`onDraw()`结束...

    android自定义View-手绘地图

    `onDraw()`方法是Android系统调用来绘制View的地方,我们在其中可以使用`Canvas`对象进行绘图。 1. 继承View 创建一个新的Java类,继承自`View`,并在构造函数中设置必要的初始化参数。例如,可能需要设置画布的...

    android开发随声音大小变化的自定义view

    可以考虑使用`postInvalidate()`而不是`invalidate()`来避免不必要的重绘,或者使用`ObjectAnimator`来平滑地过渡动画效果。 6. 将自定义View添加到布局: - 在XML布局文件中,将自定义View包含进来,指定其宽度、...

    百度Android工程师面试题.pdf

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

    Android下图片移动的demo

    为了实现平滑的动画,开发者可能使用了`postInvalidate()`或`invalidate()`方法,这将触发重绘过程,使`onDraw()`再次执行。如果需要定时更新图片位置,还可以使用`Handler`或`Runnable`配合`postDelayed()`来创建一...

Global site tag (gtag.js) - Google Analytics