处理来自UI线程的位图
来源:互联网 发布:nginx 日志记录真实ip 编辑:程序博客网 时间:2024/04/28 15:56
原文链接:http://docs.eoeandroid.com/training/displaying-bitmaps/process-bitmap.html
负责人:hepengcheng.cn
完成时间:9月13日
BitmapFactory的decode()方法,在Load Large Bitmaps Efficiently要点中进行讨论,不应该执行在主UI线程如果要读取源数据从磁盘或网络位置(或相对内存来说任何别的真实来源).该数据需要加载的时间是不可预知的,并取决于多种因素(从磁盘或网络的读取速度,图像大小,CPU的功率,等).如果这些任务阻塞UI线程,系统标志您的应用程序无响应,用户可以选择关闭它响应(有关更多信息,请参阅Designing for Responsiveness).
这节课将引导您通过在后台线程中使用AsyncTask处理位图,并告诉您如何处理并发问题.
使用一个异步任务
AsyncTask类提供了一种简单的方式来在一个后台线程中执行许多任务,并且把结果反馈给UI线程.使用的方法是,创建一个继承与它的子类并且实现提供的方法.这里是一个使用AsyncTask和decodeSampledBitmapFromResource()加载一个大图片到ImageView中的例子:
对于ImageView来说WeakReference确保那时AsyncTask并不会阻碍ImageView和任何它的引用被垃圾回收期回收.不能保证ImageView在任务完成后仍然存在,所以你必须在onPostExecute()方法中检查它的引用.ImageView可能不再存在,如果例如,如果在任务完成之前用户退出了活动或者配置发生了变化.为了异步地加载位图,简单地创建一个新的任务并且执行它:
处理并发
常见的视图组件例如ListView和GridView如在上一节中当和AsyncTask结合使用时引出了另外一个问题.为了优化内存,当用户滚动时这些组件回收了子视图.如果每个子视图触发一个AsyncTask,当它完成时没法保证,相关的视图还没有被回收时已经用在了别的子视图当中.此外,还有异步任务开始的顺序是不能保证他们完成的顺序.
这篇文章透过Multithreading for Performance功能讨论处理并发,并且提供了一个当任务完成后ImageView将一个引用存储到后面能被检查的AsyncTask的解决方案.使用类似的方法,从上一节的AsyncTask可以扩展到遵循类似的模式.
创建一个专用的Drawable的子类来存储一个引用备份到工作任务中.在这种情况下,一个BitmapDrawable被使用以便任务完成后一个占位符图像可以显示在ImageView中:
执行BitmapWorkerTask前,你创建一个AsyncDrawable,并将其绑定到目标ImageView:
如果别的正在运行的任务已经和这个ImageView关联,cancelPotentialWork引用在上面的代码示例检查中.如果这样,它试图通过调用cancel()取消先前的任务.在少数情况下,新的任务数据匹配现有的任务,而且并不需要做什么.下面是实现 cancelPotentialWork:
一个帮助方法,getBitmapWorkerTask(),使用以上来检索一个和特定ImageView相关的任务:
这最后一步是在BitmapWorkerTask更新onPostExecute()方法,以便任务取消时并且当前任务和这个ImageView关联时进行检查:
现在这个实现适合使用ListView和GridView控件组件以及回收其子视图的任何其他组件.在你正常地给你的ImageView控件设置图片时简单地调用loadBitmap就行了.例如,在一个GridView中实现的方式是在支持的适配中的[android.view.View, android.view.ViewGroup) getView()](http://docs.eoeandroid.com/reference/android/widget/Adapter.html#getView(int,)方法中.- 处理来自UI线程的位图
- 处理来自UI线程的位图
- Processing Bitmaps Off the UI Thread 处理来自UI线程的位图
- 创建带有动画的APP 之 高效的显示位图:在UI线程之外处理位图
- Android---在UI线程之外处理位图
- Processing Bitmaps Off the UI Thread(处理UI线程的位图)
- 3 Processing Bitmaps Off the UI Thread(处理UI线程的位图)
- 位图管理、图片下载缓存、管理图片内存 (三) 在非UI线程中处理位图
- 位图的简单处理
- WinForm中线程的处理(UI线程)
- Android官方开发文档Training系列课程中文版:高效显示位图之在非UI线程中处理图片
- UI线程消息处理过程
- UI线程消息处理过程
- 非UI线程处理Bitmap
- 非UI线程处理Bitmap
- 非UI线程处理Bitmap
- 关于Handler处理UI线程的更新及Handler译文
- 在线程里面出现异常需要处理UI的细节
- Java的访问权限知识
- String 类型如何转变为Timestamp类型
- (2013.03.08)求最大公约数_3种算法
- Android中Notification的framework层讲解【安卓源码解析四】
- 选项卡切换
- 处理来自UI线程的位图
- Android中音乐文件的信息详解【安卓源码解析二】
- 弹出框
- 教你更改U盘图标
- sig_automic_t
- 8.4.2(部分背包问题)
- 第二周项目2
- Properties类
- Tomcat内存、连接数性能参数设置