【问题标题】:How to fix memory leak in GridView?如何修复 GridView 中的内存泄漏?
【发布时间】:2013-12-22 16:17:59
【问题描述】:

GridView 每次旋转后内存使用量都在增加...

在 GridView 上设置适配器:

        gridview = (GridView) findViewById(R.id.grid);
        gridview.setAdapter(new MenuAdapter(getApplicationContext(), width, height, density, gridview));
        gridview.setOnItemClickListener(new OnItemClickListener() {
            public void onItemClick(AdapterView<?> parent, View v, int position, long id) {
                Toast.makeText(getApplicationContext(), Integer.toString(position), Toast.LENGTH_SHORT).show();
            }
        });

适配器getView部分:

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


    if (convertView == null) {

        gridView = new View(context);
        gridView = inflater.inflate(R.layout.menu_item, null);          

    } else {
        gridView = (View) convertView;
    }


    btn_ = (LinearLayout) gridView.findViewById(R.id.btn);
    textView = (TextView) gridView.findViewById(R.id.menuItem_txt);
    imageView = (ImageButton) gridView.findViewById(R.id.menuItem_img);

    btn_.setBackgroundColor(back_color[position]);      

    textView.setText(menuValues[position]);
    textView.setTextColor(txt_color[position]);
    textView.setTypeface(font);

    imageView.setScaleType(ImageButton.ScaleType.CENTER_CROP);
    imageView.setFocusable(false);
    imageView.setClickable(false);
    imageView.setAdjustViewBounds(true);
    imageView.setColorFilter(img_color[position]);
    imageView.setImageResource(img[position]);


    return gridView;
}

删除“else{}”和“return”语句之间的部分后,内存没有增加,所以我猜问题出在删除的代码中...?

【问题讨论】:

  • 使用视图持有者模式
  • 当你有这个gridView = inflater.inflate(R.layout.menu_item, null)时,还有什么需要gridView = new View(context)。删除它

标签: android gridview memory-leaks


【解决方案1】:

删除这个

 gridView = new View(context); // not required

使用ViewHolder 模式

http://developer.android.com/training/improving-layouts/smooth-scrolling.html

static class ViewHolder
{
TextView tv;
ImageView iv;
LinearLayout b;
}

getView更改为

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

if (convertView == null) {
    convertView = inflater.inflate(R.layout.menu_item, null);     
    holder = new ViewHolder();
    holder.iv = (ImageButton) convertView.findViewById(R.id.menuItem_img);   
    holder.b = (LinearLayout) convertView.findViewById(R.id.btn);
    holder.tv = (TextView) convertView.findViewById(R.id.menuItem_txt);
    convertView.setTag(holder);
} else {
     holder = (ViewHolder) convertView.getTag();
}


holder.b.setBackgroundColor(back_color[position]);      
holder.tv.setText(menuValues[position]);
holder.tv.setTextColor(txt_color[position]);
holder.tv.setTypeface(font);

holder.iv.setScaleType(ImageButton.ScaleType.CENTER_CROP);
holder.iv.setFocusable(false);
holder.iv.setClickable(false);
holder.iv.setAdjustViewBounds(true);
holder.iv.setColorFilter(img_color[position]);
holder.iv.setImageResource(img[position]);


return convertView;
}

【讨论】:

  • @mgulan 详细说明问题。我很确定使用视图支架会有所帮助
  • @mgulan 将您更新的代码完整发布并指定异常
  • @mgulan 编辑了我的代码。但除非您指定异常和更新的代码,否则我看不到问题。使用convertView 复制粘贴错误。拼写错误并查看stackoverflow.com/questions/11945563/…。可能会帮助您了解 listview 的工作原理
  • @mgulan 如何缩小图像。下载 BitmapFun.zip。试试代码developer.android.com/training/displaying-bitmaps/…
  • @mgulan stackoverflow.com/questions/20599669/…。看到这个。非常相似。另外在这里我也建议了 ViewHolder 模式。使用 ViewHolder 模式确实有帮助。但是我认为您无能为力,因为您说图像已经按比例缩小了。除此之外,Listview 回收视图。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-01-12
  • 2018-05-09
  • 2018-07-12
  • 2012-09-14
  • 2020-05-24
相关资源
最近更新 更多