【Android开发Wiki】进阶篇高效的显示位图(三)—缓存位图.pdfVIP

【Android开发Wiki】进阶篇高效的显示位图(三)—缓存位图.pdf

  1. 1、本文档共7页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  5. 5、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  6. 6、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  7. 7、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  8. 8、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
【Android开发Wiki】进阶篇高效的显示位图(三)—缓存位图.pdf

eoe 移动开发者社区 / 原文链接: /training/displaying-bitmaps/cache-bitmap.html 加载一副位图到你的用户界面是很简单的,然而如果你需要马上加载一组更大的图片的话就 会复杂的多.在许多情况下(例如有些组件像ListView,GridView以及ViewPager等),出现 在屏幕上的图片总量,其中包括可能马上要滚动显示在屏幕上的那些图片,实际上是无限的. 那些通过回收即将移除屏幕的子视图的组件,内存使用得以保留.如果你不长期保持你对象 的引用的话,垃圾收集器也会释放你所加载的位图内存.但为了保持一个流畅,快速加载, 并且你想避免它们每次出现在屏幕上时重复加载处理这些图片的UI的话,这最好不过了. 一个内存和磁盘的缓存通常能解决这个问题,允许组件快速地重新处理图片. 这个要点教你当加载多个位图时使用一个内存和磁盘的位图缓存来提高响应速度以及提升 整个UI界面的流畅性. 使用一个内存缓存 在占用宝贵的应用程序内存情况下,内存缓冲提供了可以快速访问位图.LruCache类(也可 以使用API级别4的Support Library)特别适合用于缓存位图的任务,最近被引用的对象保 存在一个强引用LinkedHashMap中,以及在缓存超过了其指定的大小之前释放最近很少使用 的对象的内存. 注意:在过去,一个常用的内存缓存实现是一个SoftReference或WeakReference的位图缓 存,然而现在不推荐使用.从android2.3(API 级别9)开始,垃圾回收器更加注重于回收 软/弱引用,这使得使用以上引用很大程度上无效.此外,之前的android3.0(API级别11), 位图的备份数据存储在本地那些在一种可预测的情况下没有被释放的内存中,很有可能会导 致应用程序内存溢出和崩溃. 为了选择一个合适的的LruCache大小,许多因素应当被予以考虑,例如: 其余的活动或者应用程序都是很耗内存的嘛? 大量的图片是如何立刻出现在屏幕上的?需要多少即将在屏幕上显示的? 设备的屏幕的大小和分辨率是多少?一个额外的高密度屏(xhdpi)设备,例如GalaxyNexus 将需要一个更大的缓存来维持内存中相同数量的图片,与像Nexus S (hdpi)设备比较起来. 位图是什么尺寸和配置以及每张图片要占用多少内存? 图片访问频繁嘛?比起别的将会被频繁地访问吗?也许你可能总是想要在内存中保存一定 项,甚至对于不同的位图组来说有多个LRUCache对象. 你能在数量和质量之间取得平衡嘛?有时对于存储更多的低质量的位图是更有用的,潜在地 在另外的后台任务中加载一个更高质量版本. 没有具体的大小以及适合所有应用程序的公式,它是由你来分析您的使用情况,并拿出一个 合适的解决方案.缓存太小会导致额外的没有益处的开销,缓存过大会再次导致java.lang. eoe 移动开发者社区 / OutOfMemory异常,并且只保留下你的应用程序其余相当少的内存来运行你的应用程序. 这 个例子是针对位图来设置一个LruCache: private LruCache mMemoryCache; 1 @Override 2 protected void onCreate(Bundle savedInstanceState) { 3 ... 4 // Get memory class of this device, exceeding this amount will throw an 5 // OutOfMemory exception. 6 final int memClass = ((ActivityManager) context.getSystemService( 7 Context.ACTIVITY_SERVICE)).getMemoryClass(); 8 // Use 1/8th of the available memory for this memory cache. 9 final int cacheSize = 1024 * 1024 * memClass / 8; 10 mMemoryCache = new L

文档评论(0)

wuyouwulu + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档