重复在两个页面之间导航时出现OutofMemory错误

时间:2012-12-18 10:22:18

标签: android out-of-memory

大家好我在两个页面之间导航时遇到了outofmemory错误,这两个页面有2个图库控件(图库),每个页面都有一些额外的细节来填写个人资料信息。在第一页,我们可以查看个人资料详细信息,然后我们移动到另一个页面来编辑详细信息,然后我们可以点击取消按钮返回到第一页。因此,当连续单击编辑和取消按钮时,将打开和关闭配置文件编辑页面。在重复相同的过程一段时间之后,应用程序开始在内存中运行,并且在一个阶段由于内部内存不足,应用程序无法加载页面。我正在检查解决此问题的可能解决方案。任何建议或意见将不胜感激。希望有更好的回应。在此先感谢。

以下是我的代码:

edit_button.setOnClickListener(new OnClickListener() {

        @Override
        public void onClick(View v) {
            // TODO Auto-generated method stub
            //startActivity(new Intent(ProfileView.this, ProfileEdit.class));
            startActivity(new Intent(ProfileView.this, ProfileEditLatest.class));
        }
    });

以下是图库适配器的getView方法:

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

    /*if (position>data.length || position<0) {
        return null;
    }*/
    View vi=convertView;
    ImageView image;
    if(convertView==null){
        vi = inflater.inflate(R.layout.gridview_single, null);

    //TextView text=(TextView)vi.findViewById(R.id.text);;
    image=(ImageView)vi.findViewById(R.id.image);

    final float scale = activity.getResources().getDisplayMetrics().density;
    //int pixels = (int) (100 * scale + 0.5f);
    int pixels = (int) (100 * scale + 0.5f);

    //i.setLayoutParams(new Gallery.LayoutParams(100, 100));
    //image.setLayoutParams(new Gallery.LayoutParams(pixels, pixels));
    image.setLayoutParams(new RelativeLayout.LayoutParams(pixels,pixels));

    //image.setLayoutParams(new LayoutParams(100,100));

    //text.setText("item "+position);
    }
    else{
        image=(ImageView)convertView;
    }
    try{
    vi.setTag(data[position]);
    imageLoader.DisplayImage(data[position], activity, image);
    }
    catch (ArrayIndexOutOfBoundsException e) {
        // TODO: handle exception
    }
    return vi;
}

在上面我已经使用了URL

提供的延迟加载

在我的个人资料编辑页面中,我有一个声明为静态的位图对象,用于将一些新图像上传到图库中。

希望上述细节有助于找到问题的解决方案。

1 个答案:

答案 0 :(得分:1)

你的getView()方法有问题。这不是你应该如何使用它。相反,你必须使用staic View Holder类...

 @Override
public View getView(int position, View v, ViewGroup parent) {
    // Keeps reference to avoid future findViewById()
    ViewHolder viewHolder;

    if (v == null) {
        LayoutInflater li = (LayoutInflater) getContext().getSystemService(
                Context.LAYOUT_INFLATER_SERVICE);
        v = li.inflate(R.layout.gridview_single, null);

        viewHolder = new ViewHolder();
        viewHolder.mIV = (ImageView) v.findViewById(R.id.image);


        v.setTag(viewHolder);
    } else {
        viewHolder = (ViewHolder) v.getTag();
    }

  // call ur image loader here
    imageLoader.DisplayImage(data[position], activity, image);
    return v;
}

static class ViewHolder {
    ImageView mIV;

}