android - RecyclerView android中的内存泄漏
问题描述
我在片段中有一个 RecyclerView。我确定内存泄漏来自 RecyclerView,因为当我添加 RecyclerView 时,会出现内存泄漏。
这是我的 RecyclerView 适配器:
public class TabsAdapter extends RecyclerView.Adapter<TabsAdapter.SetViewHolder> {
private Context context;
private List<TabsModel> items = Collections.emptyList();
private TabsDatabaseHelper databaseHelper;
private Dialog dialog;
public TabsAdapter(Context context, List<TabsModel> items, Dialog dialog) {
databaseHelper = new TabsDatabaseHelper(context);
this.context = context;
this.items = items;
this.dialog = dialog;
}
@NonNull
@Override
public TabsAdapter.SetViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
View view = LayoutInflater.from(parent.getContext())
.inflate(R.layout.item_tabs, parent, false);
return new SetViewHolder(view);
}
@Override
public void onBindViewHolder(@NonNull TabsAdapter.SetViewHolder holder, final int position) {
//I clean here codes, By removing the code here, Memory Leak again occur
}
@Override
public int getItemCount() {
return items == null ? 0 : items.size();
}
static class SetViewHolder extends RecyclerView.ViewHolder {
private ImageView ivShot, ivRemove;
private TextView tvTitle, tvUrl;
private ConstraintLayout constraintLayout;
private SetViewHolder(@NonNull View itemView) {
super(itemView);
ivShot = itemView.findViewById(R.id.iv_item_tabs);
ivRemove = itemView.findViewById(R.id.iv_clear_item_tabs);
tvTitle = itemView.findViewById(R.id.tv_title_item_tabs);
tvUrl = itemView.findViewById(R.id.tv_url_item_tabs);
constraintLayout = itemView.findViewById(R.id.const_item_tabs);
}
}
}
在片段中:
tabsModelArrayList.clear();
tabsModelArrayList = tabsDatabaseHelper.getData();
tabsAdapter = new TabsAdapter(context, tabsModelArrayList, getDialog());
recyClerView.setHasFixedSize(true);
LinearLayoutManager linearLayoutManager = new LinearLayoutManager(context);
recyClerView.setLayoutManager(linearLayoutManager);
recyClerView.setAdapter(tabsAdapter);
所以内存泄漏是:
我尝试在适配器中设置空视图:
@Override
public void onViewDetachedFromWindow(@NonNull SetViewHolder holder) {
super.onViewDetachedFromWindow(holder);
holder.constraintLayout = null;
holder.ivRemove = null;
holder.ivShot = null;
holder.tvTitle = null;
holder.tvUrl = null;
}
或者在 inDesroy Fragment 中,我设置:
recyClerView.setAdapter(null);
但我仍然有这个错误。你能帮助我吗?
- - - - - 编辑
我从适配器中删除了 Context 和 DatabaseHelper:
public class TabsAdapter extends RecyclerView.Adapter<TabsAdapter.SetViewHolder> {
private List<TabsModel> items = Collections.emptyList();
private Dialog dialog;
public TabsAdapter(List<TabsModel> items, Dialog dialog) {
this.items = items;
this.dialog = dialog;
}
@NonNull
@Override
public TabsAdapter.SetViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
View view = LayoutInflater.from(parent.getContext())
.inflate(R.layout.item_tabs, parent, false);
return new SetViewHolder(view);
}
@Override
public void onBindViewHolder(@NonNull TabsAdapter.SetViewHolder holder, final int position) {
//I clean here codes, By removing the code here, Memory Leak again occur
}
@Override
public int getItemCount() {
return items == null ? 0 : items.size();
}
static class SetViewHolder extends RecyclerView.ViewHolder {
private ImageView ivShot, ivRemove;
private TextView tvTitle, tvUrl;
private ConstraintLayout constraintLayout;
private SetViewHolder(@NonNull View itemView) {
super(itemView);
ivShot = itemView.findViewById(R.id.iv_item_tabs);
ivRemove = itemView.findViewById(R.id.iv_clear_item_tabs);
tvTitle = itemView.findViewById(R.id.tv_title_item_tabs);
tvUrl = itemView.findViewById(R.id.tv_url_item_tabs);
constraintLayout = itemView.findViewById(R.id.const_item_tabs);
}
}
@Override
public void onViewDetachedFromWindow(@NonNull SetViewHolder holder) {
super.onViewDetachedFromWindow(holder);
holder.constraintLayout = null;
holder.ivRemove = null;
holder.ivShot = null;
holder.tvTitle = null;
holder.tvUrl = null;
}
}
但不能修复内存泄漏。
解决方案
我可以建议你两件事。首先,您不能在您的 recyclerView 适配器构造函数中发送上下文。在您的代码中,您在 OnCreateView 中将其用作 parent.getContext 。在构造函数中发送上下文会导致内存泄漏。其次,我认为您不应该在构造函数中初始化 DatabaseHelper。您可以在创建适配器实例之前执行此操作。从数据库中获取列表并在构造函数中发送列表而不是 DatabaseHelper。
推荐阅读
- xcode - 离子电容器/Xcode 错误:缺少 pspa_proxymap
- python - 关于协方差最小化 scipy.stats.multivariate_normal.logpdf
- flutter - 如何更改文本和瓷砖之间的距离
- javascript - 在 mongoose 模式中更改 date.now 以显示这种格式的日期“MMMM Do YYYY”
- amazon-web-services - 使用启动模板时,如何使用该 Spot 队列独有的 AWS boto3“request_spot_fleet”设置标签?
- c# - iText7 - 无法设置 SquareAnnotation 内部颜色的不透明度
- traveling-salesman - 多参数任务分配的最佳算法
- reactivesearch - Reactivesearch, ReactiveList - 添加页面大小选择器
- django - 在 Django 模板中设置变量的自定义标签。将值从上下文中清空?
- ssl - 我的一个 haproxy 后端返回“没有服务器可用于处理此请求”