【问题标题】:OutOfMemory Exception Android load custom bitmap image in ImageView of RecyclerViewOutOfMemory Exception Android 在 RecyclerView 的 ImageView 中加载自定义位图图像
【发布时间】:2016-04-12 11:24:39
【问题描述】:

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

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

位图是动态创建的。

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

我不知道如何处理它? 我应该使用 LRUCache 吗? 或者像 Picasso 这样的第三方库——它似乎只适用于 url 和 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;
}

位图绘制在画布上。

【问题讨论】:

  • 能否请您至少向我们提供 RecyclerView 的 ViewAdapter 代码?可能是您在该适配器中处理了卡视图,在视图之外时保留了许多位图而不是再次释放内存。
  • Picasso 还可以处理本地图像,无论是来自资产目录还是本地设备存储

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


【解决方案1】:

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

【讨论】:

【解决方案2】:

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

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

垃圾收集器不会删除缩略图视图中的位图。

解决办法是:

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

我不再有内存异常,在 logcat 中我的最高使用量是 30mb 内存。

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

非常感谢。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-01-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-06-11
    • 2012-07-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多