`

控件更新Invalidate和postInvalidate的区别

阅读更多
http://shazhuzhu1.iteye.com/blog/971193
android中实现view的更新有两组方法,一组是invalidate,另一组是postInvalidate,其中前者是在UI线程自身中使用,而后者在非UI线程中使用。
    Android提供了Invalidate方法实现界面刷新,但是Invalidate不能直接在线程中调用,因为他是违背了单线程模型:Android UI操作并不是线程安全的,并且这些操作必须在UI线程中调用。

  Android程序中可以使用的界面刷新方法有两种,分别是利用Handler和利用postInvalidate()来实现在线程中刷新界面。

1,利用invalidate()刷新界面
  实例化一个Handler对象,并重写handleMessage方法调用invalidate()实现界面刷新;而在线程中通过sendMessage发送界面更新消息。
// 在onCreate()中开启线程

	new Thread(new GameThread()).start();、

	// 实例化一个handler

	Handler myHandler = new Handler() {
		// 接收到消息后处理
		public void handleMessage(Message msg) {
			switch (msg.what) {
			case Activity01.REFRESH:
				mGameView.invalidate(); // 刷新界面
				break;
			}
			
			super.handleMessage(msg);
		}
	};

	class GameThread implements Runnable {
		public void run() {
			while (!Thread.currentThread().isInterrupted()) {
				Message message = new Message();
				message.what = Activity01.REFRESH;
				// 发送消息
				Activity01.this.myHandler.sendMessage(message);
				try {
					Thread.sleep(100);
				} catch (InterruptedException e) {
					Thread.currentThread().interrupt();
				}
			}
		}
	}


2,使用postInvalidate()刷新界面
    使用postInvalidate则比较简单,不需要handler,直接在线程中调用postInvalidate即可。
class GameThread implements Runnable {   
        public void run() {   
            while (!Thread.currentThread().isInterrupted()) {   
                try {   
                    Thread.sleep(100);   
                } catch (InterruptedException e) {   
                    Thread.currentThread().interrupt();   
                }   
  
                // 使用postInvalidate可以直接在线程中更新界面   
                mGameView.postInvalidate();   
            }   
        }   
    }  
分享到:
评论
1 楼 yangjiantong 2011-04-13  
请问一下楼主,使用postInvalidate()刷新界面 中的mGameView.是什么?期待详解!

相关推荐

    android自定义控件之声音大小显示

    可以调用`invalidate()`或`postInvalidate()`来触发`onDraw()`的调用,重新绘制控件。 5. **性能优化** - **避免过度绘制**:确保只在必要时更新曲线,避免频繁调用`invalidate()`导致过度绘制,影响性能。 - **...

    Android拖动,缩放,自定义内容控件源码

    确保它们在拖动和缩放时能够正确响应和更新位置。 6. **性能优化**: 对于性能敏感的应用,使用硬件加速(setLayerType(View.LAYER_TYPE_HARDWARE, null))可以提高绘图效率。同时,合理使用invalidate()和...

    android控件在界面上自由拖动位置显示

    避免在`onTouchEvent`中执行耗时的操作,考虑使用`postInvalidate()`异步刷新界面,而不是立即调用`invalidate()`。 8. **兼容性测试**: 确保自定义拖动控件在不同设备和Android版本上表现一致,进行广泛的设备和...

    Android自定义控件示例

    9. **性能优化**:自定义控件需要关注性能问题,如避免在`onDraw()`中执行耗时操作,合理使用`invalidate()`和`postInvalidate()`刷新视图,以及优化测量和布局过程。 10. **测试和调试**:使用Android Studio的...

    自定义控件中一个时钟控件

    为了让时钟实时更新,我们需要在`MyClock`类中添加一个`Runnable`,并在`postInvalidate()`方法中定时调用它,以便每秒刷新一次时钟。 ```java private final Runnable updateTask = new Runnable() { @Override ...

    自定义控件遇到的两个小问题

    调用invalidate()或postInvalidate()方法可以触发控件的重绘,但需要注意的是,频繁的重绘会消耗大量性能。因此,合理控制重绘时机和优化绘制过程至关重要。此外,理解View的测量(onMeasure())、布局(onLayout()...

    Android自定义复合控件

    合理使用`invalidate()`和`postInvalidate()`方法请求视图更新。 10. **复用与封装**: 优秀的自定义控件设计应考虑可复用性和模块化。将通用功能封装成独立的组件,可以提高代码的可维护性。 综上所述,自定义...

    Android 编写自定义控件实例

    4. **设置和更新状态**:根据应用的需求,可能需要实现一些方法来设置或更新控件的状态,如`setProgress()`方法用于设置进度值。确保这些方法能够触发`invalidate()`或`postInvalidate()`,以使视图重绘。 5. **...

    仿QQ消息提醒的自定义控件

    在开发过程中,开发者可能还会遇到性能优化的问题,例如使用`硬件加速`,避免不必要的重绘,以及通过`postInvalidate()`代替`invalidate()`来提高效率。 总的来说,"仿QQ消息提醒的自定义控件"是一个涉及Android UI...

    安卓自定义控件相关-文字飞入飞出效果自定义View随机刷新数据.rar

    `Invalidate()`或`postInvalidate()`方法用于告诉Android系统View需要更新其显示内容。在自定义View中,我们需要在`onDraw()`方法中正确地处理这些新的数据,并根据数据的变化重新绘制文字。 文件名中的“自定义...

    android 自定义组合控件

    可以利用硬件加速、适时使用postInvalidate()代替invalidate()等手段提高性能。 最后,别忘了编写详细的文档和示例代码,以便其他开发者理解和使用你的自定义控件。可以将这些资料发布到开源社区,如CSDN、GitHub等...

    Android自定义带圆点的半圆形进度条

    本例展示了如何使用Android中的自定义View来实现带圆点的半圆形进度条,并且详细介绍了自定义View的基本结构、进度条的绘制、圆点的绘制、进度条的更新、Invalidate和postInvalidate的区别、自定义属性的使用和...

    [Android实例] 类似电表数字改变自定义控件

    可以利用`View`的`setWillNotDraw()`方法控制是否需要重绘,以及使用`View.postInvalidate()`而非`View.invalidate()`来延迟重绘。 总之,创建一个类似电表数字变化的自定义控件是Android开发中提高应用独特性和...

    迈速表,自定义控件

    在Android开发中,自定义控件是提升应用界面独特性和用户体验的重要手段。"迈速表",正如其名,是一种模拟汽车迈速表或者进度条的UI组件,它允许开发者根据自己的需求定制显示速度或进度的方式,使得界面更加生动、...

    Android 属性动画使控件沿贝塞尔曲线移动

    1. 使用postInvalidate()方法在动画每一帧结束后刷新视图,而不是频繁地调用invalidate(),避免过度绘制。 2. 通过设置interpolator来调整动画的速度变化,比如线性插值器可以使动画匀速进行,而...

    android自定义电池控件

    这些API的实现会涉及调用`invalidate()`或`postInvalidate()`方法来触发视图的重绘。 在实际开发中,为了提高性能和减少不必要的重绘,`BatteryView`可能利用了`Canvas`的缓存机制,比如使用`BitmapShader`来绘制...

    android 自定义控件 小球圆周运动

    - 每个帧的更新中,增加小球的角度,然后根据新的角度计算位置,并调用`invalidate()`方法触发重新绘制。 4. **动画与帧率控制** - Android的动画可以通过`postInvalidate()`或`Handler`来实现。在`onDraw()`结束...

    Android自定义控件之购物车数量加减器

    如果需要动态改变UI,优先考虑使用`postInvalidate()`而不是`invalidate()`,以防止不必要的重绘。 9. **测试与调试**: 编写单元测试和UI测试以确保控件的功能正常,同时使用Android Studio的布局编辑器检查控件...

    安卓自定义控件-点击产生圆圈水波纹效果

    - 使用`invalidate()`或`postInvalidate()`方法来请求重绘,但注意避免频繁调用导致不必要的资源消耗。 - 考虑使用硬件加速,通过在`View`的构造函数中调用`setLayerType(View.LAYER_TYPE_HARDWARE, null)`来开启...

    自定义轮播控件MyWheel

    合理地复用View,避免在`onDraw()`中执行耗时操作,可以使用`postInvalidate()`代替`invalidate()`来延迟重绘。 7. **自定义属性**: 为了使MyWheel易于配置,可以定义一些自定义属性,如滚动速度、轮播间隔、动画时...

Global site tag (gtag.js) - Google Analytics