Утечка памяти в ArrayAdapter - PullRequest
       1

Утечка памяти в ArrayAdapter

3 голосов
/ 10 марта 2012

Чтобы сделать это быстро, я объясню свою реализацию, а затем проблему =):

У меня есть объект:

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 голосов
/ 28 апреля 2012

Да, есть лучший метод: не устанавливайте такого слушателя на вашем объекте, который имеет ссылки на представления.

Вместо этого вы просто изменяете модель (MyClass) и затем вызываете adapter.notifyDatasetChanged ()на ArrayAdapter.Затем ListView будет перерисован.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...