Glide

时间:2017-03-08 11:34:01

标签: android memory-leaks android-glide

我有一个活动,可以在幻灯片中加载ImageViews中的图片。以下是我的滑行代码示例:

    Glide.with(ImageVOne.getContext())
            .load(geoInfo.getPhotoUrl1())
            .skipMemoryCache(true)
            .priority(Priority.NORMAL)
            .into(ImageVOne);

我加载了1到35张图片,每张图片应该在150ko和15之间。 250ko。我不能减少它。

此活动可以在主活动的会话中多次访问,并且每次加载不同的图片。例如,第一次是华盛顿的照片,然后是伦敦的照片等。

我的问题是,每次加载图片的活动开始时,内存的使用都会增加很多: enter image description here

我可以从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),但我没有发现任何变化。

我想我的"内存使用"每次我从图片活动到主要活动时应该减少,然后当我用新图片再次开始我的图片活动时增加。但是从我在蓝色图表上看到的情况来看,它几乎只会增加。你知道我应该做什么吗?

3 个答案:

答案 0 :(得分:1)

您可以采取多种措施来防止出现内存不足错误。它们如下。

  1. 使用GridView / RecycleView显示图像。因为它们只加载它们显示的内容。假设您的屏幕上有50张图像和10张图像,它只会加载10.这样可以减轻记忆中的压力。

  2. 使用 PLACEHOLDER 加载图片而不是黑色空间。您可以在drawable中使用低分辨率图像作为占位符。

  3. 使用 THUMBNAILS 代替实际图片。

  4. 您可以将固定dp用于imageView的高度和宽度。

  5. 将skipMemoryCache设置为true。

  6. CLEAR GLIDE内存onDestroy();

    @Override public void onDestroy() {
        super.onDestroy();
        Glide.get(this).clearMemory();
    }
    
  7. 覆盖到较小尺寸:

     .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);
    
  8. 你可以看一下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遵循其使用的生命周期