【问题标题】:Does universal-image loader support android versions prior to honeycomb?通用图像加载器是否支持蜂窝之前的 android 版本?
【发布时间】:2012-10-08 09:58:33
【问题描述】:

我想知道通用图像加载器 (Found Here) 是否支持蜂窝之前的版本。因为蜂窝之前的版本有一个单独的本机堆堆栈,位图使用的内存不计入 VM 堆。

我正在开发一个使用此库的图像密集型应用程序,并且我确实在 android ICS 上成功使用了它。现在我正在尝试降低 API 要求,但在避免内存不足异常导致我的应用崩溃时遇到了一些麻烦。

【问题讨论】:

    标签: java android universal-image-loader


    【解决方案1】:

    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
    }
    

    【讨论】:

    • thx 这正是我正在寻找的答案。并感谢 recycle() 的提示。
    • 小心回收。如果你回收缓存在 UIL 内存缓存中的 Bitmap,你会崩溃。
    • 我怎么知道它在 UIL 内存缓存中?我想我只能知道位图何时在屏幕上,但不知道何时在 UIL 内存缓存中。
    【解决方案2】:

    它应该可以工作,它将位图大小计算为:

     bitmap.getRowBytes() * bitmap.getHeight();
    

    无论它是在 java 还是本机堆上,它都能提供正确的位图大小。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-09-19
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多