3

メソッドで保存されている ViewHolder に Activity へのハンドルを保持しても安全setTagですか?

アクティビティへの参照を保存するとメモリ リークが発生する可能性があると主張するこの問題を見つけましたが、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;
}

(コードは、要点を理解するために実際のコードベースを簡略化したものです。)

私が見たコード例はどれも、ビュー以外のものへの参照をホルダーに格納していません。たまたまなのか、仕様なのか気になります。

4

1 に答える 1