android-在ViewHolder中引用活动
作者:互联网
在使用setTag方法存储的ViewHolder中保留Activity的句柄是否安全?
我发现此问题声称存储对活动的引用可能会导致内存泄漏,但已在Android 4.0中修复:https://code.google.com/p/android/issues/detail?id=18273
具体来说,我想知道拥有这样的ViewHolder是否安全:
class MyHolder {
private Context context; // <<-- is this safe to keep here??
private TextView textView;
public MyHolder(Context context) {
this.context = context;
}
public void populate(Doc doc) {
textView.setText(context.getString(doc.getTextId()));
}
public View inflate(ViewGroup parent) {
View view = LayoutInflater.from(parent.getContext()).inflate(
R.layout.doc_item, parent, false);
textView = (TextView)view.findViewById(R.id.doc_item_text);
return view;
}
}
在我的ArrayAdapter中使用getView方法,如下所示:
@Override
public View getView(int position, View row, ViewGroup parent) {
Doc doc = getItem(position);
MyHolder holder;
if (row != null) {
holder = (MyHolder) row.getTag();
} else {
holder = new MyHolder(getContext());
row = holder.inflate(parent);
row.setTag(holder);
}
holder.populate(doc);
return row;
}
(该代码是实际代码库的简化版本,目的只是为了说明这一点.)
我见过的示例代码都没有在持有者中存储对视图的引用.我想知道这是巧合还是设计使然.
解决方法:
无论在这种情况下是否安全,始终最好将Context引用保持在最低水平.使用Adapter中保存的Context引用,可以将在MyHolder中使用上下文进行的所有操作都转换为在getView()中执行的操作.这将是设计使然,因为肯定不需要设计所需要的多个Context引用.
标签:android-viewholder,performance,android-arrayadapter,android,android-adapter 来源: https://codeday.me/bug/20191029/1958100.html