OutOfMemory Exception Android 在 RecyclerView 的 ImageView 中加载自定义位图图像

OutOfMemory Exception Android load custom bitmap image in ImageView of RecyclerView

我有一个显示 CardView 的 RecyclerView。 在 CardView 中有两项:

  1. 文本视图
  2. 我的带有底层位图的自定义视图

位图是动态创建的。

在上下滚动之后我得到了 OutOfMemoryException。

我不知道该如何处理? 我应该使用 LRUCache 吗? 或者像 Picasso 这样的第三方库——它似乎只适用于 urls 和 ids?

感谢任何帮助

更新:

public class ManageProfileAdapter : RecyclerView.Adapter
{
  public override void OnBindViewHolder(RecyclerView.ViewHolder holder, int position)
  {
    ManageProfileViewHolder vh = holder as ManageProfileViewHolder;

    vh.Caption.Text = profiles[position].Name;
    vh.Thumbnail.SetProfile(profiles[position].Profile);
  }
}

缩略图 class 是从视图(包括位图)派生的自定义 class:

public class ThumbnailView : View
{
   private Canvas DrawCanvas;
   private Bitmap CanvasBitmap;
}

位图绘制在Canvas。

您一定是在代码中的某处一次又一次地创建位图数据。看看

这为我指明了正确的方向:

You must be creating bitmap data somewhere in your code again and again. Check it out

我的缩略图视图中的位图没有被垃圾收集器删除。

解决方法是:

  1. 覆盖 Fragment 的 OnDestroyView 事件
  2. 在里面调用adapter.Dispose()
  3. 在您的适配器中添加一个 ViewHolderItems 列表
  4. 在 OnCreateViewHolder 方法中将 ViewHolderItems 添加到您的列表中
  5. 覆盖适配器的 Dispose 方法
  6. 在 Dispose 方法中遍历您的列表并处理 ViewHolder 的位图
  7. 最后清除您的 ViewHolder 列表

我再也没有遇到内存异常,在 logcat 我的最高使用量是 30mb ram。

经验教训:您必须自己在 RecyclerView 中处理位图

非常感谢。