支持在安卓中UI(View)的刷新功能
2013-11-12 16:14
330 查看
[align=left] 这是一款可以支持在安卓中UI(View)的刷新功能,Android中对View的更新有很多种方式,使用时要区分不同的应用场合。我感觉最要紧的是分清:多线程和双缓冲的使用情况。[/align]
[align=left] [/align]
[align=left]现在可以尝试理解下面的模拟场景:[/align]
[align=left] 两个人:一对夫妻,老公上班,老婆在家,现在他们都要吃饭。[/align]
[align=left] “不使用多线程和双缓冲”的情况是:老公在公司吃,老婆在家吃,互不干扰,吃就是了。[/align]
[align=left] “使用多线程和不使用双缓冲”的情况是:老婆做好饭,另外让人送一份到公司,老公收到饭就可以吃了。[/align]
[align=left] “使用多线程和使用双缓冲”的情况是:老婆做好饭,等老公回家一起吃。[/align]
[align=left] [/align]
[align=left]1.不使用多线程和双缓冲[/align]
[align=left] 这种情况最简单了,一般只是希望在View发生改变时对UI进行重绘。你只需在Activity中显式地调用View对象中的invalidate()方法即可。系统会自动调用 View的onDraw()方法。[/align]
[align=left] [/align]
[align=left]2.使用多线程和不使用双缓冲[/align]
[align=left] 这种情况需要开启新的线程,新开的线程就不好访问View对象了。强行访问的话会报:android.view.ViewRoot$CalledFromWrongThreadException:Only the original thread that created a view hierarchy can touch its views.[/align]
[align=left] 这时候你需要创建一个继承了android.os.Handler的子类,并重写handleMessage(Message msg)方法。android.os.Handler是能发送和处理消息的,你需要在Activity中发出更新UI的消息,然后再你的Handler(可以使用匿名内部类)中处理消息(因为匿名内部类可以访问父类变量, 你可以直接调用View对象中的invalidate()方法 )。也就是说:在新线程创建并发送一个Message,然后再主线程中捕获、处理该消息。[/align]
[align=left] [/align]
[align=left]3.使用多线程和双缓冲[/align]
[align=left] Android中SurfaceView是View的子类,她同时也实现了双缓冲。你可以定义一个她的子类并实现SurfaceHolder.Callback接口。由于实现SurfaceHolder.Callback接口,新线程就不需要android.os.Handler帮忙了。SurfaceHolder中lockCanvas()方法可以锁定画布,绘制玩新的图像后调用unlockCanvasAndPost(canvas)解锁(显示),还是比较方便得。[/align]
[align=left] [/align]
[align=left]现在可以尝试理解下面的模拟场景:[/align]
[align=left] 两个人:一对夫妻,老公上班,老婆在家,现在他们都要吃饭。[/align]
[align=left] “不使用多线程和双缓冲”的情况是:老公在公司吃,老婆在家吃,互不干扰,吃就是了。[/align]
[align=left] “使用多线程和不使用双缓冲”的情况是:老婆做好饭,另外让人送一份到公司,老公收到饭就可以吃了。[/align]
[align=left] “使用多线程和使用双缓冲”的情况是:老婆做好饭,等老公回家一起吃。[/align]
[align=left] [/align]
[align=left]1.不使用多线程和双缓冲[/align]
[align=left] 这种情况最简单了,一般只是希望在View发生改变时对UI进行重绘。你只需在Activity中显式地调用View对象中的invalidate()方法即可。系统会自动调用 View的onDraw()方法。[/align]
[align=left] [/align]
[align=left]2.使用多线程和不使用双缓冲[/align]
[align=left] 这种情况需要开启新的线程,新开的线程就不好访问View对象了。强行访问的话会报:android.view.ViewRoot$CalledFromWrongThreadException:Only the original thread that created a view hierarchy can touch its views.[/align]
[align=left] 这时候你需要创建一个继承了android.os.Handler的子类,并重写handleMessage(Message msg)方法。android.os.Handler是能发送和处理消息的,你需要在Activity中发出更新UI的消息,然后再你的Handler(可以使用匿名内部类)中处理消息(因为匿名内部类可以访问父类变量, 你可以直接调用View对象中的invalidate()方法 )。也就是说:在新线程创建并发送一个Message,然后再主线程中捕获、处理该消息。[/align]
[align=left] [/align]
[align=left]3.使用多线程和双缓冲[/align]
[align=left] Android中SurfaceView是View的子类,她同时也实现了双缓冲。你可以定义一个她的子类并实现SurfaceHolder.Callback接口。由于实现SurfaceHolder.Callback接口,新线程就不需要android.os.Handler帮忙了。SurfaceHolder中lockCanvas()方法可以锁定画布,绘制玩新的图像后调用unlockCanvasAndPost(canvas)解锁(显示),还是比较方便得。[/align]
相关文章推荐
- mongoVUE破解
- mongoVUE破解
- DDX_Text / DDX_Control() /DoDataExchange(pDX)/update(TRUE)/update(FALSE)
- UIViewController各个方法的加载顺序
- Windows基本磁盘结构简析(四)——GPT磁盘
- rtl8192cu无线网卡移植时遇到issue nulldata to keep alive issue nulldata:0问题解决办法
- UIView知识总结
- Xcode5 “No matching provisioning profiles found issue” (but good at xcode4)
- UIWindow & UIWindowLevel详解
- ios 窗口UIWindow坐标系统转化
- UIButton的titleEdgeInsets和imageEdgeInsets属性
- SAP Query创建
- 自定义UIToolbar
- UIKit关键帧动画框架Jazz Hands、MTLog、Pocket Weather源码以及其他
- CPUID
- 北大ACM 3094 Quicksum
- Integer.valueOf(String s)与Integer.parseInt(String s)区别
- dojo reguire
- html中checkbox选中则value为yes,没选中为no
- VMware® Horizon™ Suite 简介--组件和功能