我有一个活动,可以在幻灯片中加载ImageViews中的图片。以下是我的滑行代码示例:
Glide.with(ImageVOne.getContext())
.load(geoInfo.getPhotoUrl1())
.skipMemoryCache(true)
.priority(Priority.NORMAL)
.into(ImageVOne);
我加载了1到35张图片,每张图片应该在150ko和15之间。 250ko。我不能减少它。
此活动可以在主活动的会话中多次访问,并且每次加载不同的图片。例如,第一次是华盛顿的照片,然后是伦敦的照片等。
我的问题是,每次加载图片的活动开始时,内存的使用都会增加很多:
我可以从3到5次开始活动,然后应用程序崩溃。错误消息是
java.lang.OutOfMemoryError: Failed to allocate a 1411340 byte allocation with 1126320 free bytes and 1099KB until OOM
我读过posts about memory leaks,但我认为格莱德会避免这个问题。在启动另一个图片之前,我对图片的活动已经完成,但分配给我的应用程序的内存似乎没有下降。
我还在清单中为我的图片活动添加了android:noHistory="true"
,但它并没有改变任何内容。
我在我的Manifest中添加了android:largeHeap="true"
,但它只是推迟了我的问题(我可以开始大约10到15次的图片活动)并且在应用崩溃之前我的图像视图中没有加载很多图片,所以对我来说这不是一个好的解决方案。
当我使用滑行时,我也尝试添加.skipMemoryCache(true),但我没有发现任何变化。
我想我的"内存使用"每次我从图片活动到主要活动时应该减少,然后当我用新图片再次开始我的图片活动时增加。但是从我在蓝色图表上看到的情况来看,它几乎只会增加。你知道我应该做什么吗?
答案 0 :(得分:1)
您可以采取多种措施来防止出现内存不足错误。它们如下。
使用GridView / RecycleView显示图像。因为它们只加载它们显示的内容。假设您的屏幕上有50张图像和10张图像,它只会加载10.这样可以减轻记忆中的压力。
使用 PLACEHOLDER 加载图片而不是黑色空间。您可以在drawable中使用低分辨率图像作为占位符。
使用 THUMBNAILS 代替实际图片。
您可以将固定dp用于imageView的高度和宽度。
将skipMemoryCache设置为true。
CLEAR GLIDE内存onDestroy();
@Override public void onDestroy() {
super.onDestroy();
Glide.get(this).clearMemory();
}
覆盖到较小尺寸:
.override(500, 600) //as example
以下是使用GLIDE的精炼代码:
Glide.with(this)
.load(url)
.thumbnail(0.5f)
.skipMemoryCache(true)
.diskCacheStrategy(DiskCacheStrategy.ALL)
.placeholder(R.drawable.your_placeHolder)
.into(imageVOne);
你可以看一下Glide here的抓捕机制。
答案 1 :(得分:0)
使用Glide不会是内存泄漏的问题,你可能会像监听器一样保留你的活动的其他参考,或者你忘记取消注册在启动活动时注册的东西,这将导致你的整个活动无法收集垃圾。
因此,每次启动活动或片段时,它都会创建新实例,而旧实例也会因为未注册的罪魁祸首实例而保留在内存中。
使用 Eclipse MAT 查找您的泄漏。
答案 2 :(得分:0)
以下是我的滑行代码示例: Glide.with(ImageVOne.getContext())。load(geoInfo.getPhotoUrl1())。skipMemoryCache(true).priority(Priority.NORMAL).into(ImageVOne);
你的问题很可能源于这个电话:Glide.with(ImageVOne.getContext())...
。您不希望这样做,因为View.getContext()
会返回Application Context
。将Glide与Application Context
一起使用,您告诉Glide遵循应用程序的生命周期,不您的Activity
生命周期,从而导致当您退出所述Activity
时,Glide图像加载永远不会被取消或清除。
所以改为使用:Glide.with(MyActivity.this)...
。
注意:始终将您的Glide加载请求绑定到最近的可能生命周期,以确保Glide遵循其使用的生命周期