OutOfMemory Exception Android 在 RecyclerView 的 ImageView 中加载自定义位图图像
OutOfMemory Exception Android load custom bitmap image in ImageView of RecyclerView
我有一个显示 CardView 的 RecyclerView。
在 CardView 中有两项:
- 文本视图
- 我的带有底层位图的自定义视图
位图是动态创建的。
在上下滚动之后我得到了 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
我的缩略图视图中的位图没有被垃圾收集器删除。
解决方法是:
- 覆盖 Fragment 的 OnDestroyView 事件
- 在里面调用adapter.Dispose()
- 在您的适配器中添加一个 ViewHolderItems 列表
- 在 OnCreateViewHolder 方法中将 ViewHolderItems 添加到您的列表中
- 覆盖适配器的 Dispose 方法
- 在 Dispose 方法中遍历您的列表并处理 ViewHolder 的位图
- 最后清除您的 ViewHolder 列表
我再也没有遇到内存异常,在 logcat 我的最高使用量是 30mb ram。
经验教训:您必须自己在 RecyclerView 中处理位图
非常感谢。
我有一个显示 CardView 的 RecyclerView。 在 CardView 中有两项:
- 文本视图
- 我的带有底层位图的自定义视图
位图是动态创建的。
在上下滚动之后我得到了 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
我的缩略图视图中的位图没有被垃圾收集器删除。
解决方法是:
- 覆盖 Fragment 的 OnDestroyView 事件
- 在里面调用adapter.Dispose()
- 在您的适配器中添加一个 ViewHolderItems 列表
- 在 OnCreateViewHolder 方法中将 ViewHolderItems 添加到您的列表中
- 覆盖适配器的 Dispose 方法
- 在 Dispose 方法中遍历您的列表并处理 ViewHolder 的位图
- 最后清除您的 ViewHolder 列表
我再也没有遇到内存异常,在 logcat 我的最高使用量是 30mb ram。
经验教训:您必须自己在 RecyclerView 中处理位图
非常感谢。