我使用Glide和RecyclerView加载许多不同尺寸和尺寸的图像(约200张)。
我有三个问题:
图片有时会成功加载,有时应用程序崩溃会产生OOM。
如果图像加载成功,则滚动时滞。
如果我刷新布局并重新加载相同的图像,那么它会尝试加载图像但在完成之前失败并给出OOM。
以下是相关代码:
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);
}
}
请指导我做错了什么。我之前没有处理过如此多的图像。
答案 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()
也可以提供帮助。
如果这根本没有帮助,我建议添加“加载更多”功能。因此,您最初只需加载一小部分图像,然后用户可以使用按钮加载更多图像,当它们滚动到底部或SwipeRefreshLayout
时答案 2 :(得分:0)
主要问题始终是图像,如果它们是高分辨率,则总是会调用OOM。此外,动画在列表/回收站视图中尤其有用。尝试减少图像尺寸,使用单独的图像尺寸。我最好切换到Picasso而不是滑行,因为它具有调整功能,可以很好地工作,并且可以显着提高大图像的性能。