我想知道通用图像加载器(Found Here)支持蜂窝之前的版本。由于蜂窝之前的版本具有单独的本机堆栈,因此位图使用的内存不会计入VM堆。
我正在开发一个使用此lib的图像密集型应用程序,我在android ICS上成功使用它。现在我正在尝试降低API要求,并且我在远离内存不足异常时遇到了一些麻烦,这些异常导致我的应用程序崩溃。
答案 0 :(得分:2)
Universal Image Loader支持1.5+ Android版本。 UIL尝试通过使用弱引用和自己的逻辑来阻止OOM进行缓存和引用清理。为了在3.0之前的Android版本中进行有效的内存管理,我们需要使用Bitmap.recycle()
来清除本机内存。但是UIL不能自己做,因为它无法知道Bitmap何时不可见而且没有被任何人引用。
用户应该自己回收,当他知道自己可以做到时。
还有一些UIL配置调整可以防止OOM。
P.S。:如何定义Bitmap是否在UIL内存缓存中:
Bitmap bmp = ...;
boolean isBitmapInCache = false;
MemoryCacheAware<String, Bitmap> memoryCache = ImageLoader.getInstance().getMemoryCache();
for (String key : memoryCache.keys()) {
if (bmp == memoryCache.get(key)) {
isBitmapInCache = true;
break;
}
}
if (!isBitmapInCache) {
// You can recycle bitmap
}
答案 1 :(得分:0)
它应该工作,它将位图大小计算为:
bitmap.getRowBytes() * bitmap.getHeight();
无论是在java还是本机堆上,都能提供正确的位图大小。