Android 的invalidate 与postInvalidate的用法

转载 2011年01月15日 09:02:00

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

 

from:http://crazier9527.javaeye.com/blog/485894

invalidate()和postInvalidate()的使用与区别

Android提供了Invalidate方法实现界面刷新,但是Invalidate不能直接在线程中调用,因为他是违背了单线程模型: Android UI操作并不是线程安全的,并且这些操作必须在UI线...
  • molu_chase
  • molu_chase
  • 2016年09月18日 11:15
  • 2407

Android界面刷新—— invalidate与postInvalidate

Android的invalidate与postInvalidate都是用来刷新界面的,用法区别在于:   1)invalidate():实例化一个Handler对象,并重写handleMessage方...
  • a2012s
  • a2012s
  • 2014年03月13日 09:44
  • 3581

UI刷新重绘 :invalidate() 、postInvalidate()、requestLayout() 总结。

① invalidate() : 请求重绘View树,即draw()过程。把例子中他是整个刷新着UI,并且从头到尾并不会触发onMeasure()方法(控制大小用)。如果是View就重绘View...
  • pinglingying
  • pinglingying
  • 2016年09月26日 21:12
  • 3814

刷新界面:invalidate()和postInvalidate() 的区别及使用

Android提供了Invalidate方法实现界面刷新,但是Invalidate不能直接在线程中调用,因为他是违背了单线程模型:Android UI操作并不是线程安全的,并且这些操作必须在UI线程中...
  • dsa63
  • dsa63
  • 2014年09月17日 09:51
  • 1548

invalidate()与postInvalidate()的区别

invalidate()与postInvalidate()这两个都是刷新View的API,它们主要的区别是invalidate()可以在主线程(UI线程)中调用,而不能在子线程中调用,若在子线程中进行...
  • lingdianalex
  • lingdianalex
  • 2016年09月08日 11:22
  • 442

View的两种更新方法-从源码角度分析invalidate()和postInvalidate()的区别

介绍最近在看各种Android多线程开发的各种知识,网上看到有关线程和View的东西,其中View的两种更新方法invalidate()和postInvalidate()。记得当时在深圳去面试其中有个...
  • Card361401376
  • Card361401376
  • 2016年05月24日 01:15
  • 1764

刷新界面之invalidate()与postInvalidate()

刷新界面之invalidate()与postInvalidate() 刷新View的界面,有两种方法:invalidate()和postInvalidate(),那么他们又有什么区别...
  • fyduan
  • fyduan
  • 2016年01月06日 20:52
  • 2155

Android invalidate与postInvalidate用法

根据Android SDK api文档说明invalidate 方法是用来更新视图(View)的方法,不过这东西的用法比较古怪invalidate 方法如果你直接在主线程中调用,是看不到任何更新的。如...
  • wud_jiyanhui
  • wud_jiyanhui
  • 2010年08月21日 13:43
  • 528

invalidate()、postInvalidate()、postInvalidateOnAnimation() 三者的概念,区别及使用场景

invalidate():   invalidate()函数的主要作用是请求View树进行重绘,该函数可以由应用程序调用,或者由系统函数间接调用,例如setEnable(), setSelecte...
  • lxh_bc
  • lxh_bc
  • 2017年03月23日 19:39
  • 661

Android invalidate 与postInvalidate用法

原创文章转载须留下http://www.3geye.net/?3/viewspace-2925 链接根据Android SDK api文档说明invalidate 方法是用来更新视图(View)的方法...
  • gooogledev
  • gooogledev
  • 2008年03月05日 16:10
  • 568
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Android 的invalidate 与postInvalidate的用法
举报原因:
原因补充:

(最多只允许输入30个字)