bitmap缓存处理图片

在您的UI中显示单个图片是非常简单的,如果您需要一次显示很多图片就有点复杂了。在很多情况下(例如使用ListView,GridView或者ViewPager控件),显示在屏幕上的图片以及即将显示在屏幕上的图片数量是非常大的(例如在图库中浏览大量图片)。在这些控件中,当一个子控件不显示的时候,系统会重用该控件来循环显示以便减少对内存的消耗。同时垃圾回收机制还会释放那些已经载入内存中的Bitmap资源(假设您没有强引用这些Bitmap)。一般来说这样都是不错的,但是在用户来回滑动屏幕的时候,为了保证UI的流畅性和载入图片的效率,您需要避免重复的处理这些需要显示的图片。使用内存缓存和磁盘缓存可以解决这个问题,使用缓存可以让控件快速的加载已经处理过的图片。本文介绍如何使用缓存来提高UI的载入输入和滑动的流畅性。使用内存缓存内存缓存提高了访问图片的速度,但是要占用不少内存。LruCache类(在API4之前可以使用SupportLibrary中的类)特别适合缓存Bitmap,把最近使用到的Bitmap对象用强引用保存起来(保存到LinkedHashMap中),当缓存数量达到预定的值的时候,把不经常使用的对象删除。注意:过去,实现内存缓存的常用做法是使用SoftReference或者WeakReferencebitmap缓存,但是不推荐使用这种方式。从Android2.3(APILevel9)开始,垃圾回收开始强制的回收掉soft/weak引用从而导致这些缓存没有任何效率的提升。另外,在Android3.0(APILevel11)之前,这些缓存的Bitmap数据保存在底层内存(nativememory)中,并且达到预定条件后也不会释放这些对象,从而可能导致程序超过内存限制并崩溃。在使用LruCache的时候,需要考虑如下一些因素来选择一个合适的缓存数量参数:程序中还有多少内存可用同时在屏幕上显示多少图片?要先缓存多少图片用来显示到即将看到的屏幕上?设备的屏幕尺寸和屏幕密度是多少?超高的屏幕密度(xhdpi例如GalaxyNexus)设备显示同样的图片要比低屏幕密度(hdpi例如NexusS)设备需要更多的内存。图片的尺寸和格式决定了每个图片需要占用多少内存图片访问的频率如何?一些图片的访问频率要比其他图片高很多?如果是这样的话,您可能需要把这些经常访问的图片放到内存中。在质量和数量上如何平衡?有些情况下保存大量的低质量的图片是非常有用的,当需要的情况下使用后台线程来加入一个高质量版本的图片。这里没有万能配方可以适合所有的程序,您需要分析您的使用情况并在指定自己的缓存策略。使用太小的缓存并不能起到应有的效果,而使用太大的缓存会消耗更多的内存从而有可能导致java.lang.OutOfMemory异常或者留下很少的内存供您的程序其他功能使用。下面是一个使用LruCache缓存的示例:1.privateLruCache<string,bitmap="">mMemoryCache;2.3.@Override4.protectedvoidonCreate(BundlesavedInstanceState){5....6.//Getmemoryclassofthisdevice,exceedingthisamountwillthrowan7.//OutOfMemoryexception.8.finalintmemClass=((ActivityManager)context.getSystemService(9.Context.ACTIVITY_SERVICE)).getMemoryClass();10.11.//Use1/8thoftheavailablememoryforthismemorycache.12.finalintcacheSize=1024*1024*memClass/8;13.14.mMemoryCache=newLruCache<string,bitmap="">(cacheSize){15.@Override16.protectedintsizeOf(Stringkey,Bitmapbitmap){17.//Thecachesizewillbemeasuredinbytesratherthannumberofitems.18.returnbitmap.getByteCount();19.}20.};21....22.}23.publicvoidaddBitmapToMemoryCache(Stringkey,Bitmapbitmap){24.if(getBitmapFromMemCache(key)==null){25.mMemoryCache.put(key,bitmap);26.}27.}28.publicBitmapgetBitmapFromMemCache(Stringkey){29.returnmMemoryCache.get(key);30.}注意:在这个示例中,该程序的1/8内存都用来做缓存用了。在一个normal/hdpi设备中,这至少有4MB(32/8)内存。在一个分辨率为800×480的设备中,满屏的GridView全部填充上图片将会使用差不多1.5MB(800*480*4bytes)的内存,所以这样差不多在内存中缓存了2.5页的图片。当在ImageView中显示图片的时候,先检查LruCache中是否存在。如果存在就使用缓存后...

1、当您付费下载文档后,您只拥有了使用权限,并不意味着购买了版权,文档只能用于自身使用,不得用于其他商业用途(如 [转卖]进行直接盈利或[编辑后售卖]进行间接盈利)。
2、本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供参考,付费前请自行鉴别。
3、如文档内容存在侵犯商业秘密、侵犯著作权等,请点击“举报”。

常见问题具体如下:

1、问:已经付过费的文档可以多次下载吗?

      答:可以。登陆您已经付过费的账号,付过费的文档可以免费进行多次下载。

2、问:已经付过费的文档不知下载到什么地方去了?

     答:电脑端-浏览器下载列表里可以找到;手机端-文件管理或下载里可以找到。

            如以上两种方式都没有找到,请提供您的交易单号或截图及接收文档的邮箱等有效信息,发送到客服邮箱,客服经核实后,会将您已经付过费的文档即时发到您邮箱。

注:微信交易号是以“420000”开头的28位数字;

       支付宝交易号是以“2024XXXX”交易日期开头的28位数字。

客服邮箱:

biganzikefu@outlook.com

所有的文档都被视为“模板”,用于写作参考,下载前须认真查看,确认无误后再购买;

文档大部份都是可以预览的,笔杆子文库无法对文档的真实性、完整性、准确性以及专业性等问题提供审核和保证,请慎重购买;

文档的总页数、文档格式和文档大小以系统显示为准(内容中显示的页数不一定正确),网站客服只以系统显示的页数、文件格式、文档大小作为依据;

如果您还有什么不清楚的或需要我们协助,可以联系客服邮箱:

biganzikefu@outlook.com

常见问题具体如下:

1、问:已经付过费的文档可以多次下载吗?

      答:可以。登陆您已经付过费的账号,付过费的文档可以免费进行多次下载。

2、问:已经付过费的文档不知下载到什么地方去了?

     答:电脑端-浏览器下载列表里可以找到;手机端-文件管理或下载里可以找到。

            如以上两种方式都没有找到,请提供您的交易单号或截图及接收文档的邮箱等有效信息,发送到客服邮箱,客服经核实后,会将您已经付过费的文档即时发到您邮箱。

注:微信交易号是以“420000”开头的28位数字;

       支付宝交易号是以“2024XXXX”交易日期开头的28位数字。

笔杆子文秘
机构认证
内容提供者

为您提供优质文档,供您参考!

确认删除?