我想知道通用图像加载器(在此处找到)是否支持蜂窝之前的版本。因为蜂窝之前的版本有一个单独的本机堆堆栈,所以位图使用的内存不计入 VM 堆。
我正在开发一个使用这个库的图像密集型应用程序,并且我确实在 android ICS 上成功使用了它。现在我正在尝试降低 API 要求,但我在远离导致我的应用程序崩溃的内存不足异常时遇到了一些麻烦。
我想知道通用图像加载器(在此处找到)是否支持蜂窝之前的版本。因为蜂窝之前的版本有一个单独的本机堆堆栈,所以位图使用的内存不计入 VM 堆。
我正在开发一个使用这个库的图像密集型应用程序,并且我确实在 android ICS 上成功使用了它。现在我正在尝试降低 API 要求,但我在远离导致我的应用程序崩溃的内存不足异常时遇到了一些麻烦。
Universal Image Loader 支持 1.5+ Android 版本。UIL 试图通过使用弱引用和自己的缓存和引用清理逻辑来防止 OOM。为了在 3.0 之前的 Android 版本中进行有效的内存管理,我们需要使用Bitmap.recycle()
清除本机内存。但是UIL不能自己做,因为它不知道什么时候Bitmap不可见并且没有被任何人引用。
用户应该自己做回收,当他知道他可以做到时。
还有一些 UIL 配置调整可以防止 OOM。
PS:如何定义 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
}
它应该可以工作,它将位图大小计算为:
bitmap.getRowBytes() * bitmap.getHeight();
无论它是在 java 还是本机堆上,它都会给出正确的位图大小。