Android内存不足,急!
我的应用里面需要显示大量的图片,这些图片是需要从网络上下载的,因此我做了两级的图片Cache。第一级的缓存是当图片下载下来后,保存到sdcard(或者是internal storage)中,这样就不用重复的下载了。由于同一张图片在同一个Activity中可能被多个ImageView使用,所以我做了第二级缓存:内存缓存。我使用是的是HashMap<String, SoftReference<?>>,其中作为key的Strin是文件的名字。这样子可以避免同一个图片文件被重复的decode多次了。
在我的应用中,当需要使用图片时,首先从内存的ImageCache中查找,如果查找不到,就尝试从sdcard中加载,如果还是找不到再从网络上下载。
这种设计,我认为已经能够最大限度的节省内存,并保持运行效率的。然而即便如此,我的应用在运行中,依然会抛出内存不足的异常:
11-21 21:31:38.794: E/dalvikvm-heap(26024): 1363200-byte external allocation too large for this process.
11-21 21:31:38.794: E/dalvikvm(26024): Out of memory: Heap Size=17279KB, Allocated=4237KB, Bitmap Size=6119KB, Limit=21884KB
11-21 21:31:38.794: E/dalvikvm(26024): Trim info: Footprint=7687KB, Allowed Footprint=17799KB, Trimmed=520KB
因此,必须要继续优化我的代码。首先,第二级缓存(内存缓存)的实现,我参照的是一个开源的工程的代码:https://github.com/kaeppler/droid-fu 。他使用的是
HashMap<String, SoftReference<byte[]>>。当在内存中查询到想要的图片时,将byte[]重新decode成Bitmap,显示在UI上去。
我觉得这种做法没有起到真正的缓存的效果,因为byte[]占据一份内存,当多次decode成Bitmap后,内存中会存在多个相同的Bitmap。这样的结果是比不做内存缓存还多消耗了byte[]所占据那份内存。
而且,这些Bitmap最终又会被封装成BitmapDrawable,所以是不是将内存中的缓存做成HashMap<String, SoftReference<BitmapDrawable>>,是最佳的方案呢?
在内存中,byte[],Bitmap,BitmapDrawable这三者所占用的内存关系是怎么样的呢?
我该怎么样去管理Android的内存?