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

时间:2016-04-12 11:24:39

标签: android bitmap android-recyclerview android-custom-view

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

  1. TextView
  2. 我的基础位图自定义视图
  3. 位图是动态创建的。

    在上下滚动后,我得到一个OutOfMemoryException。

    我不确定如何处理它? 我应该使用LRUCache吗? 或者像毕加索这样的第三方图书馆 - 它似乎只适用于网址和ID?

    任何帮助表示赞赏

    更新

    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);
      }
    }
    

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

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

    位图在Canvas上绘制。

2 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:0)

这引导我朝着正确的方向前进:

  

您必须再次在代码中的某处创建位图数据   再次。看看

垃圾收集器不会删除我的thumnail视图中的位图。

解决方案是:

  1. 覆盖Fragment的OnDestroyView事件
  2. 在其中调用adapter.Dispose()
  3. 在适配器中添加ViewHolderItems的列表
  4. 在OnCreateViewHolder方法中,将ViewHolderItems添加到列表中
  5. 覆盖适配器的Dispose方法
  6. 在Dispose方法中,浏览列表并处理ViewHolder的位图
  7. 最后清除您的ViewHolder列表
  8. 我没有内存异常了,在logcat中我的最高使用率是30mb ram。

    经验教训:您必须自己在RecyclerView

    中处理位图

    非常感谢。