如何减少Android中图像的内存使用

如何减少Android中图像的内存使用,android,out-of-memory,image-loading,Android,Out Of Memory,Image Loading,我有一个屏幕,我必须在屏幕上显示两个相似的图像。这两幅图像的大小都是动态的,但它们覆盖了大部分屏幕。当我在我的应用程序中导航到此屏幕时,我在AndroidStudio中看到内存监视器中出现了12MB的峰值,这意味着这两个图像都使用了12MB,因为该屏幕上没有其他UI元素,而且这两个图像相似,占用了相同的屏幕空间,我猜显示时每个图像都消耗了6MB的内存。在res目录中,这两幅图像的尺寸均为1174 x 1174像素,大小为396KB 我尝试过使用Glide,但当这些图像也通过Glide加载时,我看

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

我尝试过使用Glide,但当这些图像也通过Glide加载时,我看到了相同的内存峰值。如果应用程序试图占用比可用内存更多的内存,并且在我的应用程序的其他部分大量使用图像,那么Glide也帮不上忙。所以总是存在内存不足的问题,在显示这两幅图像的应用程序中,我发现了很多OutOfMemory异常


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

我猜您没有压缩图像,在图像压缩方面使用了非常好的技术。另外,我猜您确实使用了滑动缓存策略

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

  • DiskCacheStrategy.NONE不缓存任何内容,如前所述
  • DiskCacheStrategy.SOURCE仅缓存原始全分辨率图像。在我们上面的示例中,这将是1000x1000像素的
  • DiskCacheStrategy.RESULT仅在还原后缓存最终图像 解析(以及可能的转换)(默认行为)
  • DiskCacheStrategy.ALL缓存映像的所有版本
  • 要回答您的问题,您需要手动跟踪android中的缓存卷。请尝试强制执行垃圾收集,通常情况下,VM仅在绝对需要时执行垃圾收集,因为这很昂贵。但是,在某些情况下强制垃圾收集是有用的。例如,在查找内存泄漏时,如果要确定是否已经成功释放了一个大型对象,可以比通常更积极地启动垃圾收集


    希望这对您有所帮助。

    使用上述库,这些图像非常大。这很好,还可以尝试不缓存磁盘策略并跟踪更改。如果您的图像是可移植网络图形(PNG)或者JPEG首先考虑使用TypPyNG来应用压缩。您所发布的库只用于压缩存储中的文件,而应用程序中的图像驻留在可拖拉文件夹中。你提到过图像非常大,你能解释一下它们在什么意义上是大的吗?我使用TinyPng来缩小图像的大小,但仍然加载缩小的图像会消耗相同的内存量。这对我有影响。