垃圾收集问题Android

时间:2011-12-29 08:26:33

标签: android garbage-collection ddms

我正在为Android2.2驱动的tivi盒开发应用程序。我有一个加载屏幕,所有数据都已下载。下载数据后,它将切换到主屏幕。我的主屏幕布局有enter image description here

4个相对布局是相同的。 enter image description here

当我从gridview移动到ImageButtons时,在logcat中有很多GC火。因此,在物品之间移动时速度非常慢。

enter image description here

我尝试使用分配跟踪器,并且每当我在项目之间移动时,发现它在text.staticLayout中分配了很多。当我在scrollview中删除2 relativelayout时,GC仍会激活,但动画速度较慢。所以我认为我的问题是scrollview。 你能告诉我如何找到导致很多GC的原因(更有效地使用分配跟踪器的指南。我在Romain Guy博客上阅读了2篇关于DDMS和Android的谷歌I / O内存管理的文章。) enter image description here

我的适配器很简单。我还尝试删除所有applyReflection,自定义字体,因此它只是来自Item的getName并设置为TextView。但它仍然缓慢。来自 this tut

的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 :(得分:0)

我在Android中遇到了一个GC错误,我找到了一个解决方法来正确收集垃圾。也许这也适用于你的情况。

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;
}

答案 1 :(得分:0)

你的代码中的

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

Utils.applyReflection是否创建位图?

如果创建,此方法将被阻止,并且创建位图将导致内存中的gc变低。