【问题标题】:Android bitmap cachingAndroid 位图缓存
【发布时间】:2011-02-14 16:20:45
【问题描述】:

我有一个应用程序运行大量(约 100 个)位图 - 即音乐封面艺术。位图有两种使用方式 - 作为大背景和小 (50dip) 图标。 将两种尺寸作为单独的位图预加载和缓存是否有意义? 我已经实现了这两种方法(使用大位图作为图标|缓存两种尺寸),但我看不到实际的性能差异。 这种情况的最佳做法是什么?

【问题讨论】:

    标签: android caching bitmap drawable


    【解决方案1】:

    缓存两种尺寸的图像没有意义,它占用了太多内存。

    最佳做法是(以我的拙见):

    1. 确保您的缓存使用SoftReferences,这样您就可以确保您不会耗尽内存,并且始终可以加载新的位图,但会以丢失旧位图的“费用”为代价。
    2. 使用 Canvas 的 drawBitmap 方法将大型位图绘制得更小。
    3. 确保您提防OutOfMemoryError,并注意它是 Throwable 的子类,而不是 Exception 的子类,因此 catch(Exception e) 子句不会捕获它。

    【讨论】:

    • 感谢SoftReference!这是我错过的重要一点。
    • 是否还可以通过使用 getCacheDir()/getExternalCacheDir() 临时缓存内部/外部存储中的项目是一个合理(如果不是更好)的策略吗?我听说 Android 可以积极回收 SoftReferences,从长远来看,在设计应用程序时可能会导致更多问题需要考虑?
    • 这是两个不相关的点。您需要使用软引用来确保您没有耗尽内存。缓存到持久存储可能有助于在需要时更快地加载图像,但这取决于图像的来源:如果它们来自网络,这显然是必要的,如果它们是来自其他应用程序的资源,或者联系图片,这不是必需的。
    【解决方案2】:

    就个人而言,我会尽我所能限制我在内存中保留的位图数量。如果图标作为较大位图的缩小副本看起来不错,我会赞成这种方法。由于我的个人经验,这可能是一个有偏见的观点,但我在使用 Android 时遇到的最大问题是使用位图时内存不足

    【讨论】:

      【解决方案3】:

      不能同时保存两个文件,保存较大的一个。

      尝试做内存缓存的内存管理。

      1. out of memory exception occurs之前使用recycle()清空内存缓存。

      recycle() 在内部致力于检查引用计数机制:

      它使用引用计数(在变量mDisplayRefCountmCacheRefCount 中)来跟踪位图当前是正在显示还是在缓存中。代码在满足这些条件时回收位图:

      • mDisplayRefCount 和 mCacheRefCount 的引用计数均为 0。
      • 位图不为空,尚未回收。

      Refer Implementation here

      1. 您可以在BitmapFactory.Options 类对象中使用inBitmap 字段来保留位图以供以后使用。

      其中,从 LruCache 中逐出位图,对位图的软引用放置在 HashSet 中,以便稍后与 inBitmap 重用:

      Set<SoftReference<Bitmap>> mReusableBitmaps;
      

      3。使用 BitmapFactory.Options 类有效地在小图像视图中加载大位图。通过计算 inSampleSize 并在 options.inSampleSize 字段中提供它。

      inSampleSize 是一个因素,它决定了将大图像降低到小图像视图的程度,通过选项字段中的高度和宽度计算得出

      You may refer here for implementation

      【讨论】:

        猜你喜欢
        • 2014-02-24
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-08-17
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多