博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Android Bitmap Processing Bitmaps Off the UI Thread(渣翻译)
阅读量:4608 次
发布时间:2019-06-09

本文共 1113 字,大约阅读时间需要 3 分钟。

二:UI线程外加载图像

1.使用AsyncTask
AsyncTask类提供了一个简单的后台处理方法并将结果返回到UI线程中。
在线程中提议使用WeakReference<?>来缓存显示Bitmap的UI控件,如:ImageView。WeakReference能够确保即使在线程操作时,也能让资源回收器回收UI控件资源,如:ListView回收View资源的情况。
ex:

ImageView imageview = new ImageView(new LayoutParams(100, 100));//初始化WeakReferenceWeakReference
reference = new WeakReference
(imageview);//获取WeakReference存储内容if(reference != null && reference.get() != null) ImageView imageView = reference.get();

2.处理并发操作(多线程加载)

一些通用的组件(例如ListView和GridView)提倡另一种主流做法,当组件结合AsyncTask来显示内容时,为了有效的利用内存,用户滚动组件后,组件会回收子View资源(超出显示区域的子View)。
如果每一个子View都触发一个AsyncTask,将无法保证当该子View的AsyncTas完成时,该子View尚未被资源回收器回收就被其他子View重用。而且也无法保证异步线程开始的顺序和完成的顺序一致。
接下来这么做:
创建一个BitmapDrawable的继承类(假设为AsyncDrawable)来存储对AsyncTask引用,同样可以用到WeakReference。再执行AsyncTask前,可以先创建AsyncDrawable并绑定到ImageView上。
在进行上一步操作前,需要进行一次校验(如果当前的ImageView为重用的资源且加载的图像资源也一致,就不需要开启线程去加载同样的图像资源了),通过图像资源的标志(如ID,URI)和ImageView(如Drawable),在校验中确定是否取消AsyncTask(调用cancel()方法)。
最后在AsyncTask中需要追加看一个判断,当线程isCancelled()时,结束onPostExecute操作并返还结果,这样便强制结束重用ImageView中的线程。

转载于:https://www.cnblogs.com/rfheh/p/4164480.html

你可能感兴趣的文章
Wireless Network 并查集
查看>>
51nod 1019 逆序数
查看>>
20145202马超《JAVA》预备作业1
查看>>
云推送注意(MSDN链接)
查看>>
OpenMobile's Application Compatibility Layer (ACL)
查看>>
竞价广告系统-广告检索
查看>>
强哥PHP面向对象学习笔记
查看>>
[转]基于.NET平台常用的框架整理
查看>>
Symbian (Read Inbox)读取收件箱的内容
查看>>
良好的编程规范
查看>>
struts2 入门
查看>>
.net 编译原理
查看>>
mean 快速开发和现有技术的对比分析
查看>>
Metro Style app :浏览器扩展
查看>>
linux的kernel是怎样工作的(TI_DM36X_ARM系统)(1)
查看>>
[luogu4310] 绝世好题 (递推)
查看>>
[luogu3203 HNOI2010] 弹飞绵羊 (分块)
查看>>
-Dmaven.multiModuleProjectDirectory system propery is not set.
查看>>
Python2 unichr() 函数
查看>>
Python 字典 copy()方法
查看>>