使用Android Recyclerview Glide显示出可能的误差(OOM)



我正在使用带有回收的滑行来加载许多图像(大约200个),这些图像具有不同的尺寸和尺寸。

我有三个问题:

  1. 这些图像有时会成功加载,有时该应用会崩溃。

  2. 如果图像成功地加载了,则滚动是懒惰的。

  3. 如果我刷新布局并重新加载相同的图像,则它尝试加载图像,但在完成之前失败并给予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()也可能会有所帮助。

  1. 滑行图像调整&缩放

如果这根本没有帮助,我建议添加更多负载功能。因此,您最初只加载了一小部分图像样本,然后用户可以使用一个按钮从那里加载更多图像,当他们滚动到底部或swiperefreshlayout

时。
  1. 带有进度键教程的LoadMore Recyclerview -CodeTrick
  2. swiperefreshlayout教程
  3. 带有RecyClerview实现的LoadMore功能

希望这会有所帮助。

主要问题始终是图像,如果它们是高res,总会被调用。同样,动画在列表/回收器视图中也无济于事。尝试减少图像尺寸,将单独的图像大小进行大拇指。我比Glide更好地切换到毕加索,因为它具有调整大小的功能,可以很好地奏效,并且可以通过大型图像进行大幅度提高性能。

最新更新