滚动时ListView内存分配

时间:2015-11-20 17:18:23

标签: java android listview

我正在使用jazzylistview和view holder方法。当我滚动列表视图时,我注意到越来越多的内存被分配。它不是很多,但是当我滚动时,内存会增加。我已经尝试从列表视图和字体中删除图像。我在android api 22上运行。这是列表视图的视图持有者方法:

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

    if (convertView==null) {
        face = Typeface.createFromAsset(context.getAssets(), "font/Roboto-Regular.ttf");
        face1 = Typeface.createFromAsset(context.getAssets(), "font/Roboto-Thin.ttf");
        convertView = View.inflate(context, R.layout.rss_item, null);
        holder = new ViewHolder();
        holder.itemTitle = (TextView) convertView.findViewById(R.id.textView);
        holder.itemTitle1 = (TextView) convertView.findViewById(R.id.textView1);
        holder.image = (ImageView) convertView.findViewById(R.id.icon);
        holder.itemTitle.setTypeface(face);
        holder.itemTitle1.setTypeface(face1);
        convertView.setTag(holder);
    } else {
        holder= (ViewHolder) convertView.getTag();
    }

    EventItem item = itemList.get(position);
    holder.itemTitle.setText(item.getTitle());
    holder.itemTitle1.setText(item.getDate());
    if (item.getIcon() != 1) {
        holder.image.setImageResource(item.getIcon());
    }
    return convertView;
}

static class ViewHolder {
    TextView itemTitle;
    TextView itemTitle1;
    ImageView image;
}

1 个答案:

答案 0 :(得分:1)

代码的Typeface.createFromAsset部分可能非常繁重。我建议在适配器的构造函数中读取这两种字体,并使用2个全局变量来设置自定义TypeFace。

除此之外,轻微的内存增加可能是正常的,特别是因为可能需要对新位置的视图进行膨胀并创建新对象。 Android可以决定可以为您的应用分配多少内存,当您达到某个“限制”时,它将开始转储其中的一部分。

你可能遇到的唯一真正问题是当内存被持续分配但是垃圾收集器无法开始做它并释放内存。基本上,如果你看到你的图表在增长,然后回到某个水平,你就没事了。

此外,如果分配的内存总体仍然很高,则您的应用中的其他位置可能会出现问题。