我正在使用带有回收的滑行来加载许多图像(大约200个),这些图像具有不同的尺寸和尺寸。
我有三个问题:
-
这些图像有时会成功加载,有时该应用会崩溃。
-
如果图像成功地加载了,则滚动是懒惰的。
-
如果我刷新布局并重新加载相同的图像,则它尝试加载图像,但在完成之前失败并给予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);
}
}
请指导我做错了什么。我以前从未使用过这么多图像。
我找到了原因。问题在于我正在使用嵌套的crollview放置在recyclerview上方。这可能导致所有图像一次加载。我删除了嵌套的Crollview,并要求大约200张图像,并且现在正常工作。
参考:在Glide中加载更多图像时,内存错误
感谢您的写作回复。它们也很有用!
没有简单的方法来确定是什么原因导致您的OutOfMemoryException
,但是有一些方法可以防止它。首先,我会阅读此问题,然后查看Android Studio的内存监视器功能,以确定应用程序中其他任何地方是否导致内存泄漏。
然后,我会查看一些图像尺寸,以及您是否需要确定其在伴随图像时裁剪的必需品。GLIDE中的.Override(width, height)
功能可以帮助您(用像素调整宽度和高度)。甚至进一步的.centerCrop()
和.fitCenter()
也可能会有所帮助。
- 滑行图像调整&缩放
如果这根本没有帮助,我建议添加更多负载功能。因此,您最初只加载了一小部分图像样本,然后用户可以使用一个按钮从那里加载更多图像,当他们滚动到底部或swiperefreshlayout
时。- 带有进度键教程的LoadMore Recyclerview -CodeTrick
- swiperefreshlayout教程
- 带有RecyClerview实现的LoadMore功能
希望这会有所帮助。
主要问题始终是图像,如果它们是高res,总会被调用。同样,动画在列表/回收器视图中也无济于事。尝试减少图像尺寸,将单独的图像大小进行大拇指。我比Glide更好地切换到毕加索,因为它具有调整大小的功能,可以很好地奏效,并且可以通过大型图像进行大幅度提高性能。