无花兄弟的3geye好像关站了,就从javaeye转载好了。
转自:http://wuhua.iteye.com/blog/168358
根据Android SDK api文档说明
invalidate 方法是用来更新视图(View)的方法,不过这东西的用法比较古怪
invalidate 方法如果你直接在主线程中调用,是看不到任何更新的。
http://www.hiapk.com/bbs/thread-13060-1-1.html
如果跟线程结合使用的话
比如在下面的代码中就会抛出异常
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);
// 这里处理视图需要更新的代码。
}
};
总结,发现Google Android 好像有点弱智了。Api这么难用,不如J2ME简单啊。
对于postInvalidate用法来说就相对简单点了直接调用就OK了,这里就不详细说了。
分享到:
相关推荐
`Invalidate`和`postInvalidate`是Android提供的两种主要的View刷新机制,它们虽然都能达到更新界面的效果,但在使用场景和执行机制上有所区别。 首先,`Invalidate`方法是直接在UI线程中调用的。当调用一个View的`...
Android中实现view的更新有两组方法,一组是invalidate,另一组是postInvalidate,其中前者是在UI线程自身中使用,而后者在非UI线程中使用。 Android提供了Invalidate方法实现界面刷新,但是Invalidate不能直接在...
当`invalidate()`的请求被处理时,会触发`onDraw()`回调,但这不是立即发生的,因为Android使用了一种称为`Choreographer`的框架来管理帧率,确保UI更新与屏幕刷新同步。`Choreographer`会在每个VSYNC信号到来时检查...
本篇文章将深入探讨Android中View的绘制流程以及`invalidate()`方法的工作原理。 首先,我们需要了解Android视图的生命周期,它包括测量(Measure)、布局(Layout)和绘制(Draw)三个主要阶段: 1. **测量阶段(Measure...
那么,为什么需要使用postInvalidate方法呢?这是因为invalidate方法只能在主线程中调用,而postInvalidate方法可以在任何线程中调用。 接下来,让我们讨论一下子线程是否可以更新UI的问题。答案是可以的。在...
Android程序中可以使用的界面刷新方法有两种,分别是利用Handler和利用postInvalidate()来实现在线程中刷新界面。 利用Handler刷新界面 实例化一个Handler对象,并重写handleMessage方法调用invalidate()实现界面...
在Android开发中,View是构建用户界面的基本元素,它的绘制流程和`invalidate()`等相关方法是开发者需要深入理解的关键概念。本文将详细解析Android中View的绘制流程,以及`invalidate()`等核心方法的工作原理。 ...
在Android开发中,更新UI是常见的任务,但为了遵循Android的单线程模型,所有与用户界面相关的操作都必须在主线程(UI线程)中执行。这是因为Android系统为了保证界面操作的一致性和线程安全,规定了UI操作不能在...
本例展示了如何使用Android中的自定义View来实现带圆点的半圆形进度条,并且详细介绍了自定义View的基本结构、进度条的绘制、圆点的绘制、进度条的更新、Invalidate和postInvalidate的区别、自定义属性的使用和...
View 的刷新使用 handle.sendMessage 发送信息,然后在 handle 的 getMessage 里面执行 invalidate 或者 postInvalidate。GC 内存泄露的出现情况包括数据库的 cursor 没有关闭、构造 adapter 时没有使用缓存 ...
【Android invalidate()与postInvalidate()用法】 invalidate()方法用于立即重新绘制View,而postInvalidate()则会在UI线程的下一个事件循环中触发重绘。如果需要在非UI线程中更新视图,应使用postInvalidate()。 ...
当小球位置发生变化时,需要调用`invalidate()`或`postInvalidate()`方法通知系统进行重绘。`onDraw()`方法会在下一帧合适的时间被调用,重新绘制小球的新位置。 3. **Canvas与Paint对象**: `Canvas`是用于在指定...
- 每个帧的更新中,增加小球的角度,然后根据新的角度计算位置,并调用`invalidate()`方法触发重新绘制。 4. **动画与帧率控制** - Android的动画可以通过`postInvalidate()`或`Handler`来实现。在`onDraw()`结束...
可以考虑使用`postInvalidate()`而不是`invalidate()`来避免不必要的重绘,或者使用`ObjectAnimator`来平滑地过渡动画效果。 6. 将自定义View添加到布局: - 在XML布局文件中,将自定义View包含进来,指定其宽度、...
`onDraw()`方法是Android系统调用来绘制View的地方,我们在其中可以使用`Canvas`对象进行绘图。 1. 继承View 创建一个新的Java类,继承自`View`,并在构造函数中设置必要的初始化参数。例如,可能需要设置画布的...
- View的刷新:通过Handler发送消息,然后在Handler中调用`invalidate()`或`postInvalidate()`刷新界面。 - 内存泄露:未关闭的数据库Cursor、未正确使用的Adapter、未回收的Bitmap对象等可能导致内存泄露。使用DDMS...
为了实现平滑的动画,开发者可能使用了`postInvalidate()`或`invalidate()`方法,这将触发重绘过程,使`onDraw()`再次执行。如果需要定时更新图片位置,还可以使用`Handler`或`Runnable`配合`postDelayed()`来创建一...