Android 内存泄漏与 Glide

Ale*_*494 9 android memory-leaks android-glide

我有一个活动,它通过滑行在 ImageViews 中加载图片。这是我的滑行代码示例:

    Glide.with(ImageVOne.getContext())
            .load(geoInfo.getPhotoUrl1())
            .skipMemoryCache(true)
            .priority(Priority.NORMAL)
            .into(ImageVOne);
Run Code Online (Sandbox Code Playgroud)

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

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

我的问题是每次启动加载图片的活动时,内存的使用都会增加很多: 在此处输入图片说明

我可以启动 3 到 5 次活动,然后应用程序崩溃。错误信息是

java.lang.OutOfMemoryError: Failed to allocate a 1411340 byte allocation with 1126320 free bytes and 1099KB until OOM
Run Code Online (Sandbox Code Playgroud)

我读过关于内存泄漏的帖子,但我认为 Glide 会避免这个问题。我的图片活动在另一个活动开始之前完成,但分配给我的应用程序的内存似乎没有下降。我还在android:noHistory="true"清单中添加了我的图片活动,但它没有改变任何东西。

android:largeHeap="true"在我的清单中添加了但它只是推迟了我的问题(我可以启动图片活动大约 10 到 15 次)并且在应用程序崩溃之前我的图像视图中没有加载很多图片,所以这对我来说不是一个好的解决方案。

我还尝试在使用 glide 时添加 .skipMemoryCache (true) 但我没有注意到任何变化。

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

tah*_*pam 13

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

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

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

  3. 使用缩略图代替实际图像。

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

  5. 将skipMemoryCache 设置为true。

  6. 清除滑翔记忆 onDestroy();

    @Override public void onDestroy() {
        super.onDestroy();
        Glide.get(this).clearMemory();
    }
    
    Run Code Online (Sandbox Code Playgroud)
  7. 覆盖更小尺寸:

     .override(500, 600) //as example
    
    Run Code Online (Sandbox Code Playgroud)

    这是使用 GLIDE 的改进代码:

       Glide.with(this)
            .load(url)
            .thumbnail(0.5f)
            .skipMemoryCache(true) 
            .diskCacheStrategy(DiskCacheStrategy.ALL)
            .placeholder(R.drawable.your_placeHolder)
            .into(imageVOne);
    
    Run Code Online (Sandbox Code Playgroud)

您可以在此处查看 Glide 的捕获机制。

  • 使用 glide 4.x 不再是最好的解决方案 Glide.get(context).clearMemory(); 清除所有内存并不是特别有效,应尽可能避免以避免卡顿和增加加载时间。http://bumptech.github.io/glide/doc/caching.html#memory-cache (3认同)

Jag*_*gan -1

使用 Glide 不会出现内存泄漏的问题,您可能会保留 Activity 的其他引用,例如侦听器,或者您忘记注销在启动 Activity 时已注册的某些内容,这将导致您的整个 Activity 无法收集垃圾。

因此,每次启动活动或片段时,它都会创建新实例,而由于任何未注册的罪魁祸首实例,旧实例也会保留在内存中。

使用Eclipse MAT查找泄漏。