Проблема с сборкой мусора Android - PullRequest
1 голос
/ 29 декабря 2011

Я разрабатываю приложение для Tivi Box на базе Android2.2. У меня есть экран загрузки, и все данные были загружены. После того, как данные загружены, они переключаются на домашний экран. Мой домашний экран имеет макет enter image description here

4 относительных макета одинаковы. enter image description here

Когда я перехожу от gridview к ImageButtons и наоборот, много GC запускается в logcat. Так что это очень медленно при перемещении между элементами.

enter image description here

Я пытался использовать трекер выделения и обнаружил, что он много выделяется в text.staticLayout при каждом перемещении между элементами. Когда я удаляю 2 относительных слоя в scrollview, GC все еще срабатывает, но анимация менее медленная. Так что я думаю, что моя проблема с прокруткой. Не могли бы вы показать, как найти причину GC? enter image description here

Мой адаптер прост. Я также пытаюсь удалить все applyReflection, пользовательский шрифт, чтобы он получал только getName из Item и устанавливал в TextView. Но это все еще медленно. Класс applyReflection от до настоящего момента

public View getView(int position, View convertView, ViewGroup parent) {
    // TODO Auto-generated method stub
    Clip item = listClip.get(position);
    View itemView;
    ViewHolder holder;
    if(convertView == null){
        LayoutInflater inflater = LayoutInflater.from(mContext);
        itemView = inflater.inflate(R.layout.griditem_home, null);
        holder = new ViewHolder();
        holder.icon = (ImageView)itemView.findViewById(R.id.filmIcon); 
        holder.genre = (TextView)itemView.findViewById(R.id.cliptype);
        holder.view = (TextView)itemView.findViewById(R.id.clipview);
        holder.name = (TextView)itemView.findViewById(R.id.clipName);

        holder.view.setTypeface(myriadRegular);
        holder.name.setTypeface(myriadBold);
        holder.genre.setTypeface(myriadRegular);

        itemView.setTag(holder);
    } else {

        itemView = convertView;
        holder = (ViewHolder) itemView.getTag();
    }

    holder.icon.setImageBitmap(Utils.applyReflection(bitmap));
    holder.name.setText(item.getName());
    holder.view.setText("Number of view: "+item.getNumberView());
    holder.genre.setText(item.getTypename());
    return itemView;

}

class ViewHolder {

    ImageView icon;
    TextView name, genre, view;
}

Спасибо за вашу помощь. Я новый Android

Ответы [ 2 ]

0 голосов
/ 29 декабря 2011

в вашем коде:

holder.icon.setImageBitmap(Utils.applyReflection(bitmap));

Utils.applyReflection - создавать растровое изображение или нет?

, если создать, этот метод заблокирует, а создание растрового изображения приведет к тому, что gc будет в памятинизкий.

0 голосов
/ 29 декабря 2011

Я столкнулся с ошибкой GC в Android, которую я нашел, чтобы правильно собрать этот мусор. Может быть, это относится и к вашей ситуации.

http://code.google.com/p/android/issues/detail?id=8488

Вот выпадающее решение. Просто производные от BetterActivity вместо Activity. Это очистит все элементы рисования при изменении ориентации, а также при переключениях активности и т. Д. *

public abstract class BetterActivity extends Activity
{
  @Override
  protected void onResume()
  {
    System.gc();
    super.onResume();
  }

  @Override
  protected void onPause()
  {
    super.onPause();
    System.gc();
  }

  @Override
  public void setContentView(int layoutResID)
  {
    ViewGroup mainView = (ViewGroup)
      LayoutInflater.from(this).inflate(layoutResID, null);

    setContentView(mainView);
  }

  @Override
  public void setContentView(View view)
  {
    super.setContentView(view);

    m_contentView = (ViewGroup)view;
  }

  @Override
  public void setContentView(View view, LayoutParams params)
  {
    super.setContentView(view, params);

    m_contentView = (ViewGroup)view;
  }

  @Override
  protected void onDestroy()
  {
    super.onDestroy();

    // Fixes android memory  issue 8488 :
    // http://code.google.com/p/android/issues/detail?id=8488
    nullViewDrawablesRecursive(m_contentView);

    m_contentView = null;
    System.gc();
  }

  private void nullViewDrawablesRecursive(View view)
  {
    if(view != null)
    {
      try
      {
        ViewGroup viewGroup = (ViewGroup)view;

        int childCount = viewGroup.getChildCount();
        for(int index = 0; index < childCount; index++)
        {
          View child = viewGroup.getChildAt(index);
          nullViewDrawablesRecursive(child);
        }
      }
      catch(Exception e)
      {          
      }

      nullViewDrawable(view);
    }    
  }

  private void nullViewDrawable(View view)
  {
    try
    {
      view.setBackgroundDrawable(null);
    }
    catch(Exception e)
    {          
    }

    try
    {
      ImageView imageView = (ImageView)view;
      imageView.setImageDrawable(null);
      imageView.setBackgroundDrawable(null);
    }
    catch(Exception e)
    {          
    }
  }

  // The top level content view.
  private ViewGroup m_contentView = null;
}
...