Android - 一个非常轻的应用程序中的未知内存泄漏

时间:2014-03-06 03:19:06

标签: android

我正在编写一个非常简单的“联系人”应用程序。现在,我只有一个ListView,每个名称旁边都是一个图像。只有20个联系人,每个图像的平均值约为4.5kb,因此启动它时我无法达到应用程序的内存限制。我不确定问题出在哪里,但我猜测它是在生成行的代码中。

public View getView(int position, View convertView, ViewGroup parent) {
    LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    View row = inflater.inflate(R.layout.single_row, parent, false);
    TextView name = (TextView) row.findViewById(R.id.topLine);
    TextView phone = (TextView) row.findViewById(R.id.secondLine);
    ImageView icon = (ImageView) row.findViewById(R.id.icon);

    name.setText(contactArray.get(position).getName());
    phone.setText((CharSequence) contactArray.get(position).getPhone().getWorkPhone());
    new ImageDownloader(icon).execute(contactArray.get(position).getImageURL());

    return row;
}

如果我注释掉与我的ImageView相关的行,问题就会消失。为什么这些线占用的内存超过了必要的数量?

1 个答案:

答案 0 :(得分:2)

您正在为每个视图充气xml布局,而不是回收现有视图。膨胀布局是一项昂贵的操作(在内存中),所以你可以从那里开始。

public View getView(int position, View convertView, ViewGroup parent) {
if (convertView == null) {
    convertView = mInflater.inflate(R.layout.your_layout, null);
}

TextView text = (TextView) convertView.findViewById(R.id.text);
text.setText("Position " + position);

return convertView;

}

然后使用ViewHolder模式

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

    if (convertView == null) {
        convertView = mInflater.inflate(R.layout.your_layout, null);

        holder = new ViewHolder();
        holder.text = (TextView) convertView.findViewById(R.id.text);

        convertView.setTag(holder);
    } else {
        holder = convertView.getTag();
    }

    holder.text.setText("Position " + position);

    return convertView;
}

private static class ViewHolder {
    public TextView text;
}

来源:http://lucasr.org/2012/04/05/performance-tips-for-androids-listview/