android中实现view的更新有两组方法,

一组是invalidate,另一组是postInvalidate,其中前者是在UI线程自身中使用,而后者在非UI线程中使用。

SDK中说:

public void invalidate()
Invalidate the whole view. If the view is visible, onDraw(Canvas) will be called at some point in the future. This must be called from a UI thread. To call from a non-UI thread, call postInvalidate().

public void postInvalidate ()
Cause an invalidate to happen on a subsequent cycle through the event loop. Use this to invalidate the View from a non-UI thread.

google的文档的说明实在是简单,往往看了开发中都会遇到这两个问题:
1. 没有任何异常,view没能刷新。
2. android应用异常终止,打开logcat会看到这样的异常信息, Only the original thread that created a view hierarchy can touch its views。

最 后,通过查文档,上网查询才知道,invalidate和postInvalidate方法需要使用android提供的handler,才能实现重绘 , 而在文档的说明中却只字不提,真是简单啊。具体是在需要重绘的地方调用handler的sendMessage方法发送消息,紧接着会os会触发 handler中的handlerMessage方法,在handlerMessage方法中再调用view的invalidate或者 postInvalidate方法就能实现重绘。

class CustomizeView extends WhichView {

public CustomizeView(Context context) {
super(context);
final Handler handler = new Handler();

new Thread(new Runnable() {
@Override
public void run() {
// delay some minutes you desire.
/*try {
Thread.sleep(3000);
} catch (InterruptedException e) {
}*/
handler.post(new Runnable() {
public void run() {
concreteUpdateUI();
invalidate();
}
});
}
}).start();
}

protected void concreteUpdateUI() {
// Add concrete movement for UI updates.
// ...
}
}

更多相关文章

  1. Android的UI主线程和子线程
  2. Android Studio Gradle自动打包文档
  3. Could not find SDK_Root\tools\adb.exe 的解决方法
  4. Android高手进阶教程(八)-------Android中两种设置全屏的方法!!!
  5. Android Studio导入.so库文件方法
  6. (转)Android 应用程序退出后不在运行列表中显示的方法
  7. 1.活用Android线程间通信的Message机制
  8. Android Gallery控件使用方法详解

随机推荐

  1. Yii 框架使用Gii生成代码操作示例
  2. Yii 框架入口脚本示例分析
  3. jsp登录页面的简单实例 雏形
  4. 光影如何绘画?漫画人物脸部光影画法
  5. 模态框的实例演示
  6. jsp中自定义Taglib详解
  7. 模态框学习与实践
  8. php没有文件被上传的实例分析及解决办法
  9. jsp中自定义Taglib详解
  10. ASP动态include文件