【问题标题】:How to reduce memory usage of image in Android如何减少Android中图像的内存使用量
【发布时间】:2017-04-25 06:17:40
【问题描述】:

我有一个屏幕,我必须在屏幕上显示两个相似的图像。这两个图像的大小都是动态的,但它们覆盖了大部分屏幕。当我在我的应用程序中导航到此屏幕时,我在 AndroidStudio 的内存监视器中看到了 12MB 的峰值,这意味着这两个图像都在使用该 12MB,因为该屏幕上没有其他 UI 元素,并且由于这两个图像相似,需要等量屏幕空间,我猜每个显示时会消耗 6MB 内存。这两张图片的尺寸均为 1174 x 1174 像素,在 res 目录中大小为 396KB。

我尝试过使用 Glide,但是当这些图像也通过 Glide 加载时,我看到同样的内存峰值。如果应用程序试图占用比可用内存更多的内存并且在我的应用程序的其他部分中大量使用图像,即使 Glide 也无济于事。所以总是存在内存紧缩,并且在显示这两个图像的应用程序中出现了很多 OutOfMemory 异常。

所以我的问题是如何减少这些图像的内存使用量?还有,为什么 res 文件夹中的图片大小为 396KB 时,却占用了 6MB 内存?

【问题讨论】:

    标签: android out-of-memory image-loading


    【解决方案1】:

    我猜你没有压缩你的图像,使用https://github.com/zetbaitsu/Compressor 非常擅长图像压缩。另外我猜你确实使用了 Glide 缓存策略。

    但是,Glide 会缓存原始的全分辨率图像以及该图像的更小版本。例如,如果您请求一个 1000x1000 像素的图像,而您的 ImageView 是 500x500 像素,Glide 会将这两个版本的图像都放入缓存中。

    1. 如前所述,DiskCacheStrategy.NONE 不缓存任何内容
    2. DiskCacheStrategy.SOURCE 仅缓存原始全分辨率图像。在我们上面的示例中,这将是 1000x1000 像素的像素
    3. DiskCacheStrategy.RESULT 只缓存最终图像,减少后 分辨率(以及可能的转换)(默认行为)
    4. DiskCacheStrategy.ALL 缓存图像的所有版本

    要回答您的答案,您需要手动跟踪 android 中的缓存量。尝试强制进行垃圾收集,通常情况下,VM 仅在绝对需要时执行垃圾收集,因为它很昂贵。但是,在某些情况下强制垃圾收集可能很有​​用。例如,在定位内存泄漏时,如果您想确定一个大对象是否已经成功释放,您可以比平时更积极地启动垃圾回收。

    希望这对您有所帮助。

    【讨论】:

    • 这些图片很大
    • 尝试使用上面的库很好,也尝试不缓存磁盘策略并跟踪您的更改
    • 如果您的图像是可移植网络图形 (PNG) 或 jpeg,请考虑先使用 TInyPng 进行压缩。
    • 您发布的库仅用于压缩存储上的文件,而我的应用程序中的图像位于可绘制文件夹中。您提到图像非常大,您能解释一下它们在什么意义上是大的吗?
    • 我使用 TinyPng 来减小图像的大小,但仍然加载减小大小的图像会消耗相同数量的内存。它已经生效。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-09-12
    • 1970-01-01
    • 2020-01-27
    • 2018-07-12
    • 2021-12-12
    • 1970-01-01
    相关资源
    最近更新 更多