- 1、本文档共6页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
bitmap缓存处理图片的
在您的UI中显示单个图片是非常简单的,如果您需要一次显示很多图片就有点复杂了。在很多情况下(例如使用 ListView, GridView 或者?ViewPager控件),显示在屏幕上的图片以及即将显示在屏幕上的图片数量是非常大的(例如在图库中浏览大量图片)。
在这些控件中,当一个子控件不显示的时候,系统会重用该控件来循环显示 以便减少对内存的消耗。同时垃圾回收机制还会释放那些已经载入内存中的Bitmap资源(假设您没有强引用这些Bitmap)。一般来说这样都是不错的,但是在用户来回滑动屏幕的时候,为了保证UI的流畅性和载入图片的效率,您需要避免重复的处理这些需要显示的图片。 使用内存缓存和磁盘缓存可以解决这个问题,使用缓存可以让控件快速的加载已经处理过的图片。
本文介绍如何使用缓存来提高UI的载入输入和滑动的流畅性。
使用内存缓存
内存缓存提高了访问图片的速度,但是要占用不少内存。?LruCache类(在API 4之前可以使用Support Library?中的类 )特别适合缓存Bitmap, 把最近使用到的Bitmap对象用强引用保存起来(保存到LinkedHashMap中),当缓存数量达到预定的值的时候,把不经常使用的对象删除。
注意:?过去,实现内存缓存的常用做法是使用SoftReference?或者WeakReference?bitmap 缓存,但是不推荐使用这种方式。从Android 2.3 (API Level 9) 开始,垃圾回收开始强制的回收掉 soft/weak 引用 从而导致这些缓存没有任何效率的提升。另外,在 Android 3.0 (API Level 11)之前,这些缓存的Bitmap数据保存在底层内存(native memory)中,并且达到预定条件后也不会释放这些对象,从而可能导致程序超过内存限制并崩溃。
在使用?LruCache?的时候,需要考虑如下一些因素来选择一个合适的缓存数量参数:
程序中还有多少内存可用
同时在屏幕上显示多少图片?要先缓存多少图片用来显示到即将看到的屏幕上?
设备的屏幕尺寸和屏幕密度是多少?超高的屏幕密度(xhdpi 例如?Galaxy Nexus)设备显示同样的图片要比低屏幕密度(hdpi 例如?Nexus S)设备需要更多的内存。
图片的尺寸和格式决定了每个图片需要占用多少内存
图片访问的频率如何?一些图片的访问频率要比其他图片高很多?如果是这样的话,您可能需要把这些经常访问的图片放到内存中。
在质量和数量上如何平衡?有些情况下保存大量的低质量的图片是非常有用的,当需要的情况下使用后台线程来加入一个高质量版本的图片。
这里没有万能配方可以适合所有的程序,您需要分析您的使用情况并在指定自己的缓存策略。使用太小的缓存并不能起到应有的效果,而使用太大的缓存会消耗更多的内存从而有可能导致 java.lang.OutOfMemory 异常或者留下很少的内存供您的程序其他功能使用。
下面是一个使用?LruCache?缓存的示例:
private?LruCachestring,?bitmap=?mMemoryCache;?
???????????????????????????????????????????????????????????????
@Override?
protected?void?onCreate(Bundle?savedInstanceState)?{?
????...?
????//?Get?memory?class?of?this?device,?exceeding?this?amount?will?throw?an?
????//?OutOfMemory?exception.?
????final?int?memClass?=?((ActivityManager)?context.getSystemService(?
????????????Context.ACTIVITY_SERVICE)).getMemoryClass();?
???????????????????????????????????????????????????????????????
????//?Use?1/8th?of?the?available?memory?for?this?memory?cache.?
????final?int?cacheSize?=?1024?*?1024?*?memClass?/?8;?
???????????????????????????????????????????????????????????????
????mMemoryCache?=?new?LruCachestring,?bitmap=(cacheSize)?
您可能关注的文档
最近下载
- 《货代销售管理培训》课件.pptx VIP
- 大班科学《藏在身体上的尺子》微课件.pptx
- _恶性潜能未定的子宫平滑肌瘤诊治的中国专家共识(2024年版).pdf
- 双碱法软化除硬加药量及污泥量的计算.docx
- 卫生专业技术资格考试疾病控制(中级361)专业实践能力试题及答案指导.docx VIP
- 2025年卫生专业技术资格考试疾病控制(中级361)专业实践能力试卷及答案指导.docx VIP
- 卫生专业技术资格考试疾病控制(中级361)基础知识试卷及答案指导(2025年).docx VIP
- 《CACA甲状腺癌诊治指南(2025版)》更新要点解读PPT课件.pptx VIP
- 公考协议班合同模板下载.docx
- 人教版道德与法治一年级下册《第四单元 争做中国好儿童》大单元整体教学设计.docx
文档评论(0)