我是所有内存管理主题的新手,所以有很多我不了解的事情。
我正在尝试将图像缓存在我的应用程序中,但是我在内存消耗方面遇到了麻烦:
几乎所有Bitmap Chaching代码都可以从此处复制粘贴:http : //developer.android.com/training/displaying-bitmaps/index.html
我调试了代码,并在Eclipse的DDMS视图中检查了堆大小,在这些代码行之后跳了约15mb:
options.inJustDecodeBounds = false;
return BitmapFactory.decodeResource(res, resId, options);
在“ decodeSampledBitmapFromResource”方法中。
图片为1024x800、75kb jpg文件。根据我在互联网上看到的图像,该图像应该占用的内存量约为1024 * 800 * 4(每像素字节)= 3.125mb
有关此主题的所有线程都没有说出为什么它占用的内存比应有的多。有没有一种方法可以缓存具有合理内存量的图像?
编辑
我尝试使用下面@ArshadParwez答案中建议的encodeFile方法。使用此方法后,在BitmapFactory.decodeStream方法之后,内存仅增加了3.5mb-问题已解决,有点类似,但是我想直接从资源中缓存位图。
我注意到在encodeResource方法期间有2个内存“跳跃”-一个大约3.5mb-这是合理的,另一个奇怪的是14mb。这些14mb的用途是什么?为什么会发生这种情况?
图像也会根据密度进行缩放,因此它们可以使用大量内存。
例如,如果图像文件位于drawable
文件夹(mdpi
密度)中,并且您在xhdpi
设备上运行它,则宽度和高度都会加倍。也许这个链接可以帮助您,或者这个。
因此,在您的示例中,图像文件将占用的字节为:
(1024 * 2)*(800 * 2)* 4 = 13,107,200字节
如果您在xxhdpi
设备(例如HTC one和Galaxy S4)上运行它,甚至会更糟。
你能做什么?可以将图像文件放置在正确的密度文件夹(drawable-xhdpi
或drawable-xxhdpi
)中,也可以将其放置在drawable-nodpi
(或资产文件夹中)并根据需要缩小图像尺寸。
顺便说一句,您不必设置,options.inJustDecodeBounds = false
因为它是默认行为。实际上,您可以将位图选项设置为null。
关于缩放下来,你可以使用谷歌的方式或我的方式每个人都有自己的优点和缺点。
关于缓存,有很多方法可以做到。最常见的一种是LRU缓存。我最近还创建了另一种方法(请在此处或此处链接),该方法可以缓存更多的图像并避免使用OOM,但这给您带来了很多责任。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句