Glide不会加载所有图像(本地文件)(OutOfMemory)

时间:2019-05-08 12:33:36

标签: android android-glide

Glide版本4.9.0

在我的应用中,我有10个活动。用户在每个活动上单击下一步,以导航到下一个活动,直到他最终到达上一个活动。 前5个活动包含ImageViews

前3个活动有一个大的ImageView

活动四有5个较小的ImageViews

活动五有8个较小的ImageViews

_

要加载的图像位于drawable文件夹中的项目资源中。

在使用Glide之前,我只是在xml文件中使用了android:src的{​​{1}}属性, 当用户尝试使用5 ImageView打开“活动四”时,这会在Galaxy S6设备上导致以下错误:

  

java.lang.OutOfMemoryError:无法分配10240012字节   分配6982184个空闲字节和6MB直到OOM

因此,我决定使用ImageViews将图像加载到Glide中,并删除了ImageViews属性。图片看起来模糊,因此我在声明中添加了android:src

dontTransform()

在模拟器和我的物理设备(小米Mi A2 Android 9)上,一切看起来都很好。 Glide的唯一缺点是您可以看到Glide.with(this).load(R.drawable.myImg1).dontTransform().skipMemoryCache(true).listener(new LoggingListener(getApplicationContext())).into(iv_p1); 一张一张地加载图片。

在之前扔过ImageViews的Galaxy S6上,所有活动均显示无任何错误。 但是只有8个中的前4个 OutOfMemoryError加载了他们的图像。 我以为RAM仍然是个问题,而Glide只是通过停止加载图像来防止溢出。所以我将图片文件的尺寸从500x500调整为200x200。

现在 8个中的前6个 ImageViews已加载其图像。

LeakCanary 没有显示任何泄漏。

滑行错误日志:

ImageViews

在不降低质量的情况下,我无法真正降低分辨率,即使我将分辨率设置得足够低以显示设备上的所有图像,也不能保证其他内存更低的设备也可以显示所有图像。

我无法在自己的设备或任何仿真器上重现此行为(即使将仿真器的RAM设置为最小128MB也不例外)。 为了释放一些内存,可以转到下一个活动时卸载当前活动的图像吗?

编辑:

加载所有图像后,模拟器上的内存从启动时的40 MB增大到220 MB。图像是200x200像素的JPG文件。

以下xml布局的预览:

enter image description here

这是带有8个ImageViews的活动的xml布局:

Failed to load resource
There were 4 causes:
java.lang.OutOfMemoryError(Failed to allocate a 26214412 byte allocation with 932280 free bytes and 910KB until OOM)
java.lang.OutOfMemoryError(Failed to allocate a 26214412 byte allocation with 922168 free bytes and 900KB until OOM)
java.lang.OutOfMemoryError(Failed to allocate a 2560012 byte allocation with 914680 free bytes and 893KB until OOM)
java.lang.OutOfMemoryError(Failed to allocate a 2560012 byte allocation with 937496 free bytes and 915KB until OOM)
call GlideException#logRootCauses(String) for more detail

3 个答案:

答案 0 :(得分:1)

在退出活动时删除所有图像,然后在返回活动时重新添加所有图像会使内存不足,无法在大多数设备上正常工作。

在每个活动中:

@override
protected void onStart() {
    Glide.with(this).load(R.drawable.img).diskCacheStrategy(DiskCacheStrategy.NONE).skipMemoryCache(true).dontTransform().into(imageView);
    super.onStart();
}

@override
protected void onStop() {
    Glide.with(this).clear(imageView);
    super.onStop();
}

为不同的屏幕分辨率提供图像可以帮助保持尽可能低的内存使用率。我用NativeScript Image Builder创建了我的所有资产。

答案 1 :(得分:0)

.diskCacheStrategy(DiskCacheStrategy.NONE)

答案 2 :(得分:-1)

尝试更改Glide代码,例如:

Glide.with(this)
     .load(R.drawable.myImg1)
     .skipMemoryCache(true)
     .dontTransform().into(iv_p1);

如果您的图片没有动态更改(意味着有任何图片在动态加载并且不会动态更改),请添加以下行:

.diskCacheStrategy(DiskCacheStrategy.AUTOMATIC)