ArrayAdapter中的内存泄漏

时间:2012-03-09 21:43:41

标签: java android android-layout memory-leaks

为了快速完成,我将解释我的实现,然后问题=):

我有一个对象:

Class myClass{
  ......attrs......
  ......getters and setters......

  public void setOnMyClassChangeListener(MyClassChangeListener listener){
      this.listener=listener;
  }
}

ListView使用该方法监视该类的对象ArrayAdapter:

static class ViewHolder {
        View view1,view2,view3.....;
    }

@Override
public View getView(int position, View convertView, ViewGroup parent) {

    final ViewHolder holder;
    View rowView = convertView;
    if (rowView == null) {
        LayoutInflater inflater = (LayoutInflater) getContext()
             .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        rowView = inflater.inflate(R.layout.templaterow, null, true);
        holder = new ViewHolder();
        holder.view1=.....;
        holder.view2=.....;
        holder.view3=.....;
        rowView.setTag(holder);
    } else {
        holder = (ViewHolder) rowView.getTag();
    }
    MyClass object= items.get(position)
    object.setOnMyClassChangeListener(MyClassChangeListener(){
          public void onMyClassChangeListener(MyClass obj){
               holder.view1.setXX(obj.getValue1());
               holder.view2.setXX(obj.getValue2());
               ......
          }
    }
    );
}

所以我认为我正在泄漏内存,因为侦听器在退出ListActity之后保持设置然后持有者被泄露了吗?

是否有一种方法比onStop中的适配器迭代移除侦听器更好?

由于

1 个答案:

答案 0 :(得分:0)

是的,有一个更好的方法:不要在你的对象上设置这样的监听器,这个监听器有对视图的引用。

相反,您只需修改模型(MyClass),然后在ArrayAdapter上调用adapter.notifyDatasetChanged()。然后ListView将重绘。