使用android ReclerView滑行显示OutOfMemory Error(OOM)

时间:2016-12-23 18:28:42

标签: android android-recyclerview out-of-memory android-glide

我使用Glide和RecyclerView加载许多不同尺寸和尺寸的图像(约200张)。

我有三个问题:

  1. 图片有时会成功加载,有时应用程序崩溃会产生OOM。

  2. 如果图像加载成功,则滚动时滞。

  3. 如果我刷新布局并重新加载相同的图像,那么它会尝试加载图像但在完成之前失败并给出OOM。

  4. 以下是相关代码:

    public static class MyViewHolder extends RecyclerView.ViewHolder {
    
        @Override
        public void onBindViewHolder(final MyViewHolder holder, final int listPosition) {
                ImageView imageView = holder.imageView;
                Glide.with(imageView.getContext())
                        .load(tweetMapArray.get(listPosition).get("imageURL").toString())
                        .diskCacheStrategy(DiskCacheStrategy.ALL)
                        .crossFade()
                        .into(imageView);
        // imageURL is a valid URL for each item
        }
    
        @Override
        public void onViewDetachedFromWindow(MyViewHolder holder) {
            super.onViewDetachedFromWindow(holder);
            Glide.clear(holder.imageView);
        }
    }
    

    请指导我做错了什么。我之前没有处理过如此多的图像。

3 个答案:

答案 0 :(得分:5)

我找到了原因。问题是我使用的是放在RecyclerView上面的NestedScrollView。这可能导致所有图像立即加载。 我删除了NestedScrollView并请求了大约200张图片,现在它的工作非常流畅。

参考:Out Of Memory Error When loading more images in Glide

感谢您撰写回复。它们也很有用!

答案 1 :(得分:3)

没有简单的方法来确定导致OutOfMemoryException的原因,但有办法阻止它。首先,我会阅读this issue,然后查看Android Studio的Memory Monitor功能,以确定您应用中的其他任何地方是否导致内存泄漏。

然后,我会看一些图像大小,以及是否需要确定在绑定图像时裁剪图像是否必要。 Glide中的.Override(width, height)功能可以为您提供帮助(宽度和高度将根据像素调整大小)。更进一步.centerCrop().fitCenter()也可以提供帮助。

  1. Glide Image Resizing & Scaling
  2. 如果这根本没有帮助,我建议添加“加载更多”功能。因此,您最初只需加载一小部分图像,然后用户可以使用按钮加载更多图像,当它们滚动到底部或SwipeRefreshLayout

    1. LoadMore RecyclerView with ProgressBar tutorial - CodeTrick
    2. SwipeRefreshLayout tutorial
    3. LoadMore Feature with RecyclerView implementation
    4. 希望这有帮助。

答案 2 :(得分:0)

主要问题始终是图像,如果它们是高分辨率,则总是会调用OOM。此外,动画在列表/回收站视图中尤其有用。尝试减少图像尺寸,使用单独的图像尺寸。我最好切换到Picasso而不是滑行,因为它具有调整功能,可以很好地工作,并且可以显着提高大图像的性能。