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布局的预览:
这是带有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
答案 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)