原文:
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机制是View树中非常重要的一部分,它负责对View树进行重绘和更新。当我们对View进行修改时,需要调用invalidate方法来触发重绘过程。那么,今天我们就来浅...
在Android开发中,`Invalidate`是一个至关重要的概念,它涉及到UI更新机制,与用户界面的刷新和重绘紧密相关。当我们对一个View调用`invalidate()`方法时,实际上是触发了该View的重新绘制过程。这个过程涉及到多个...
Android中实现view的更新有两组方法,一组是invalidate,另一组是postInvalidate,其中前者是在UI线程自身中使用,而后者在非UI线程中使用。 Android提供了Invalidate方法实现界面刷新,但是Invalidate不能直接在...
本篇文章将深入探讨Android中View的绘制流程以及`invalidate()`方法的工作原理。 首先,我们需要了解Android视图的生命周期,它包括测量(Measure)、布局(Layout)和绘制(Draw)三个主要阶段: 1. **测量阶段(Measure...
【Android invalidate()与postInvalidate()用法】 invalidate()方法用于立即重新绘制View,而postInvalidate()则会在UI线程的下一个事件循环中触发重绘。如果需要在非UI线程中更新视图,应使用postInvalidate()。 ...
"invalidate()方法在Android中的应用和实现" invalidate()方法是Android中的一种常用方法,主要用于刷新View的界面。当View的显示状态发生改变时,需要调用invalidate()方法来重新绘制界面。invalidate()方法的调用...
Sync Project with gradle files:对gradle文件之后,或刷新gradle配置时使用; Make project:只是对项目中新产生或修改过的文件进行一次编译,已经编译过...Invalidate Cache/Restart AndroidStudio:自动生成的项目
在Android开发中,View是构建用户界面的基本元素,它的绘制流程和`invalidate()`等相关方法是开发者需要深入理解的关键概念。本文将详细解析Android中View的绘制流程,以及`invalidate()`等核心方法的工作原理。 ...
Android提供了Invalidate方法实现界面刷新,但是Invalidate不能直接在线程中调用,因为他是违背了单线程模型:Android UI操作并不是线程安全的,并且这些操作必须在UI线程中调用。 Android程序中可以使用的界面...
在Android开发中,更新View是常见的任务,而`invalidate()`和`postInvalidate()`就是用于这一目的的关键方法。这两者都是用来标记一个View为脏(dirty),需要重新绘制,但它们在使用场景和机制上有所不同。 1. `...
在游戏循环中,注意适时调用View的invalidate()方法来触发重绘,以确保游戏画面的流畅更新。 最后,为了提高用户体验,游戏应该具备友好的用户界面和反馈机制。这包括设计吸引人的图形界面,提供清晰的指引和提示,...
protected void on invalidate() { super.onInvalidated(); if (/* 动画结束条件 */) { return; } // 更新currentFrame并再次调用postInvalidateOnAnimation() } } ``` 在布局文件中添加自定义加载框: ...
5. **invalidate()**:在需要重新绘制时,调用此方法通知系统。比如在触摸事件处理后,或者属性改变时。 接下来,我们可以在布局XML文件中添加这个自定义控件,指定其属性,如大小、颜色等。同时,我们还可以为它...
可以使用`setLayerType()`方法设置为Hardware加速,或者在需要时手动调用`invalidate()`。 7. **生命周期管理**:当Activity或Fragment的生命周期发生变化时,需要正确处理GIF动画的暂停和恢复。例如,在onPause()...
在Android开发中,窗口抖动(Window Jitter)通常指的是用户界面元素在短时间内频繁更新或重绘,导致屏幕上的视图出现不稳定、闪烁或者抖动的现象。这种问题可能会影响用户体验,甚至在某些情况下消耗大量的系统资源...