网站大量收购独家精品文档,联系QQ:2885784924

bitmap缓存处理图片的.doc

  1. 1、本文档共6页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 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)?

文档评论(0)

ayangjiayu3 + 关注
实名认证
内容提供者

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

1亿VIP精品文档

相关文档