`
panshaobinSB
  • 浏览: 198734 次
  • 性别: 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 分析,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧

    分析invalidate流程例子

    分析invalidate流程例子

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

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

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

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

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

    Android中View控件的Demo,值得学习。实现画多个圆圈的效果。

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

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

    android中Invalidate和postInvalidate的更新view区别

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

    Android线程机制_2011_9_30更新

    根据开发经验以及android机制,结合Java多线程和android多线程,说明问题。 给初学android或者对android的多线程机制还有点迷惑...关于invalidate参看:http://blog.csdn.net/androidbluetooth/article/details/6695516

    Android 手绘折线图

    invalidate(); } /** * 画折线 * * @param canvas */ private void drawLine(Canvas canvas) { Xoffset = ((getWidth()) - 20) / (xlist.size()); Yoffset = (getHeight()) / (ylist.size()); ...

    Android studio的make Project、clean Project、Rebuild Project

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

    Android中刷新界面的二种方法

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

    android 快速翻书

    照比較正常的作法, 如果不是做Game之類的應該通常會新增thread處理工作後, 使用handler傳送msg去View#invalidate畫面, 或是在非UI thread呼叫View#postInvalidate. 所以如果需要比較高效的畫面更新就可以用看看...

    Android-UI刷新

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

    android中实现ios8的实时毛玻璃效果

    在android下实现ios的实时毛玻璃效果的demo。使用非常简单,可以根据自己的需求对代码进行修改。 一般情况下只需要把需要模糊的view继承BlurringView,然后设置背景的blurredView。然后在画面刷新的时候使用...

    【Android】自定义圆形进度条效果(有进度标识点)

    this.invalidate(); } /** * 非UI线程调用 */ public void setProgressNotInUiThread(int progress, View view) { this.progress = progress; view.setAnimation(pointRotationAnima(0, (int) (((float...

Global site tag (gtag.js) - Google Analytics