Android 中View的更新介绍——多线程和双缓冲
来源:互联网 发布:oracle数据导入 编辑:程序博客网 时间:2024/05/29 17:13
现在可以尝试理解下面的模拟场景:
两个人:一对夫妻,老公上班,老婆在家,现在他们都要吃饭。
“不使用多线程和双缓冲”的情况是:老公在公司吃,老婆在家吃,互不干扰,吃就是了。
“使用多线程和不使用双缓冲”的情况是:老婆做好饭,另外让人送一份到公司,老公收到饭就可以吃了。
“使用多线程和使用双缓冲”的情况是:老婆做好饭,等老公回家一起吃。
1.不使用多线程和双缓冲
这种情况最简单了,一般只是希望在View发生改变时对UI进行重绘。你只需在Activity中显式地调用View对象中的invalidate()方法即可。系统会自动调用 View的onDraw()方法。
2.使用多线程和不使用双缓冲
这种情况需要开启新的线程,新开的线程就不好访问View对象了。强行访问的话会报:android.view.ViewRoot$CalledFromWrongThreadException:Only the original thread that created a view hierarchy can touch its views.
这时候你需要创建一个继承了android.os.Handler的子类,并重写handleMessage(Message msg)方法。android.os.Handler是能发送和处理消息的,你需要在Activity中发出更新UI的消息,然后再你的Handler(可以使用匿名内部类)中处理消息(因为匿名内部类可以访问父类变量, 你可以直接调用View对象中的invalidate()方法 )。也就是说:在新线程创建并发送一个Message,然后再主线程中捕获、处理该消息。
另外还可以调用postInvalidate()方法实现重绘。
3.使用多线程和双缓冲
Android中SurfaceView是View的子类,她同时也实现了双缓冲。你可以定义一个她的子类并实现SurfaceHolder.Callback接口。由于实现SurfaceHolder.Callback接口,新线程就不需要android.os.Handler帮忙了。SurfaceHolder中lockCanvas()方法可以锁定画布,绘制玩新的图像后调用unlockCanvasAndPost(canvas)解锁(显示),还是比较方便得。
- Android 中View的更新介绍——多线程和双缓冲
- Android中 view的双缓冲技术
- Android中 view的双缓冲技术
- android中Invalidate和postInvalidate的更新view区别
- android中Invalidate和postInvalidate的更新view区别
- android中Invalidate和postInvalidate的更新view区别
- Android View 双缓冲技术
- Android中View和ViewGroup介绍
- Android中View和ViewGroup介绍
- Android中View和ViewGroup介绍
- Android中View和ViewGroup介绍
- Android中View和ViewGroup介绍
- Android中View和ViewGroup介绍
- Android中View和ViewGroup介绍
- Android中View和ViewGroup介绍
- Android中View和ViewGroup介绍
- Android中View更新方法Invalidate()和postInvalidate()
- android中view控件的setTag()和getTag()用法和功能介绍
- 生成二维码代码
- Spring中AOP的实现 (三)
- Linux动态库搜索路径的设定
- 风吟提供伤感日志:爱你→承诺
- 安装apache中遇到 的问题
- Android 中View的更新介绍——多线程和双缓冲
- IT行业为什么需要更多的女性?
- 高数第六章 定积分的应用
- Git of [error]could not find git path
- 没有什么不可能
- hook ZwQuerySystemInformation 隐藏进程
- LINK : fatal error LNK1104: cannot open file "Debug/Style.exe"
- 无法直接启动带有“ 类库输出类型 ”的项目
- C# DataTable的詳細用法