Java 多次滚动时OutOfMemoryException

Java 多次滚动时OutOfMemoryException,java,android,Java,Android,我在gridview滚动中遇到问题。我已经做了一个自定义gridview,并在原始文件中插入小部件,然后通过视图将它们膨胀。我得到了正确的结果和正确的数据,一切都进行得很顺利,但当我快速地上下滚动gridview 3-4次时,它会引发一个OutOfMemoryException 此应用程序包含已安装应用程序列表和图标列表 以下是我的自定义适配器代码: package com.AppFavorits; import java.util.ArrayList; import android.c

我在gridview滚动中遇到问题。我已经做了一个自定义gridview,并在原始文件中插入小部件,然后通过视图将它们膨胀。我得到了正确的结果和正确的数据,一切都进行得很顺利,但当我快速地上下滚动gridview 3-4次时,它会引发一个
OutOfMemoryException

此应用程序包含已安装应用程序列表和图标列表

以下是我的自定义适配器代码:

  package com.AppFavorits;

import java.util.ArrayList;

import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.drawable.BitmapDrawable;
import android.graphics.drawable.Drawable;
import android.os.AsyncTask;
import android.view.Gravity;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.view.ViewGroup.LayoutParams;
import android.widget.BaseAdapter;
import android.widget.CheckBox;
import android.widget.ImageView;
import android.widget.RelativeLayout;
import android.widget.TextView;

import com.AppFavorits.ImageLoad.ImageLoader;

public class GridViewAdapter extends BaseAdapter {
    private Context activit;
    LayoutInflater inflator;
    public RelativeLayout imgvGridItem;
    public TextView txtGridItemlabel;
    public CheckBox chkbxGridItem;
     ArrayList<PInfo> lstpinfo = new ArrayList<PInfo>();
     public ImageLoader imageLoader; 
     public GridViewAdapter(Context m1, ArrayList<PInfo> lstpinfo) {

            activit = m1;
            inflator = LayoutInflater.from(m1);
            this.lstpinfo = lstpinfo;
              imageLoader=new ImageLoader(m1.getApplicationContext());

        }

    public static class ViewHolder {

    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        // TODO Auto-generated method stub
        ViewHolder view;
        // LayoutInflater inflator = activit.getLayoutInflater();


        view = new ViewHolder();
        convertView = inflator.inflate(R.layout.gridviewrow, null);

        imgvGridItem = (RelativeLayout) convertView
                .findViewById(R.id.rlGreidItemicon);
        txtGridItemlabel = (TextView) convertView
                .findViewById(R.id.txtGridItemlabel);
        chkbxGridItem = (CheckBox) convertView
                .findViewWithTag(R.id.chkbxGridItem);
        if ((lstpinfo.get(position).appname.toString()) != null){
            Drawable d = lstpinfo.get(position).icon;  
            //new ImageLoad().execute();

            imgvGridItem.addView(getimageviewimage(lstpinfo.get(position).icon));
            txtGridItemlabel.setText(lstpinfo.get(position).appname.toString());

            // convertView.setTag(view);
        }

        return convertView;

    }

    @Override
    public int getCount() {
        return lstpinfo.size();
    }

    @Override
    public Object getItem(int position) {
        return lstpinfo.get(position);
    }

    @Override
    public long getItemId(int position) {
        return position;
    }

    public RelativeLayout getimageviewimage(Drawable d) {
        RelativeLayout seprator = new RelativeLayout(activit);
        seprator.setLayoutParams(new LayoutParams(LayoutParams.WRAP_CONTENT,
                LayoutParams.WRAP_CONTENT));
        seprator.setGravity(Gravity.LEFT | Gravity.CENTER);

        ImageView imgmap = new ImageView(activit);
        imgmap.setLayoutParams(new LayoutParams(LayoutParams.WRAP_CONTENT,
                LayoutParams.WRAP_CONTENT));
        // imgmap.setBackgroundResource(R.drawable.a13);
        Bitmap bitmap = ((BitmapDrawable)d).getBitmap();
        imageLoader.DisplayImage(bitmap, imgmap);

        //imgmap.setImageBitmap(bitmap);
        seprator.setPadding(5, 5, 15, 5);
        seprator.addView(imgmap);

        return seprator;

    }
     private class ImageLoad extends AsyncTask<Void, Void, Void> {
           // private final ProgressDialog dialog = new ProgressDialog(tranning.this);
            protected void onPreExecute() {
            //  this.dialog.setMessage("Please Wait...");
             // this.dialog.show();
              // put your code which preload with processDialog  
            }
              @Override
              protected Void doInBackground(Void... arg0) {
                   // put your code here
                   return null;
              }

             @Override
             protected void onPostExecute(final Void unused) {
                /*if (this.dialog.isShowing()) {
                this.dialog.dismiss();
             }   */
          }
      }
}
package com.AppFavorits;
导入java.util.ArrayList;
导入android.content.Context;
导入android.graphics.Bitmap;
导入android.graphics.drawable.BitmapDrawable;
导入android.graphics.drawable.drawable;
导入android.os.AsyncTask;
导入android.view.Gravity;
导入android.view.LayoutInflater;
导入android.view.view;
导入android.view.ViewGroup;
导入android.view.ViewGroup.LayoutParams;
导入android.widget.BaseAdapter;
导入android.widget.CheckBox;
导入android.widget.ImageView;
导入android.widget.RelativeLayout;
导入android.widget.TextView;
导入com.AppFavorits.ImageLoad.ImageLoader;
公共类GridViewAdapter扩展了BaseAdapter{
私人语境活动;
充气机;
公共相对物项;
公共文本视图txtGridItemlabel;
公共复选框chkbxGridItem;
ArrayList lstpinfo=新的ArrayList();
公共图像加载器;
公共GridViewAdapter(上下文m1,ArrayList lstpinfo){
activit=m1;
充气机=从(m1)开始的充气机;
this.lstpinfo=lstpinfo;
imageLoader=新的imageLoader(m1.getApplicationContext());
}
公共静态类视图持有者{
}
@凌驾
公共视图getView(int位置、视图转换视图、视图组父视图){
//TODO自动生成的方法存根
视图持有者视图;
//LayoutInflater充气器=activit.getLayoutInflater();
视图=新的ViewHolder();
convertView=充气机。充气(R.layout.gridviewrow,null);
imgvGridItem=(RelativeLayout)convertView
.findviewbyd(R.id.rlGreidItemicon);
txtGridItemlabel=(TextView)convertView
.findViewById(R.id.txtGridItemlabel);
chkbxGridItem=(复选框)convertView
.findViewWithTag(R.id.chkbxGridItem);
if((lstpinfo.get(position.appname.toString())!=null){
可绘制d=lstpinfo.get(position).icon;
//新建ImageLoad().execute();
addView(getimageviewimage(lstpinfo.get(position.icon));
txtgriditemlab.setText(lstpinfo.get(position.appname.toString());
//setTag(视图);
}
返回视图;
}
@凌驾
public int getCount(){
返回lstpinfo.size();
}
@凌驾
公共对象getItem(int位置){
返回lstpinfo.get(位置);
}
@凌驾
公共长getItemId(int位置){
返回位置;
}
公共相对图getimageviewimage(可绘制d){
RelativeLayout Seperator=新的RelativeLayout(活动);
seperator.setLayoutParams(新的LayoutParams(LayoutParams.WRAP_内容,
LayoutParams.WRAP_内容);
seperator.setGravity(Gravity.LEFT | Gravity.CENTER);
ImageView imgmap=新的ImageView(活动);
imgmap.setLayoutParams(新的LayoutParams(LayoutParams.WRAP_内容,
LayoutParams.WRAP_内容);
//imgmap.setBackgroundResource(R.drawable.a13);
位图位图=((BitmapDrawable)d).getBitmap();
显示图像(位图,imgmap);
//imgmap.setImageBitmap(位图);
seperator.setPadding(5,5,15,5);
seperator.addView(imgmap);
回流分离器;
}
私有类ImageLoad扩展异步任务{
//private final ProgressDialog=新建ProgressDialog(tranning.this);
受保护的void onPreExecute(){
//this.dialog.setMessage(“请稍候…”);
//this.dialog.show();
//将预加载的代码放入processDialog
}
@凌驾
受保护的Void doInBackground(Void…arg0){
//把你的代码放在这里
返回null;
}
@凌驾
后期执行时受保护的无效(最终无效未使用){
/*if(this.dialog.isShowing()){
this.dialog.disclose();
}   */
}
}
}

我认为
getview

内存不足
通常意味着没有足够的内存来加载文件。请尝试关闭所有其他应用程序(或至少关闭一些其他应用程序)并重试。

内存不足通常意味着没有足够的内存来加载文件。请尝试关闭所有其他应用程序(或至少关闭一些其他应用程序)并重试。

在getView()中,您没有重复使用convertView,而是始终使用充气器为新应用程序充气。这需要更多的内存,并使您的代码更慢。另外,请检查是否使用imageLoader泄漏图像。

在getView()中,您没有重复使用convertView,而是始终使用充气器为新图像充气。这需要更多的内存,并使您的代码更慢。另外,请使用imageLoader检查图像是否泄漏。

从以下链接下载代码,并使用gridview而不是listview


从以下链接下载代码,并使用gridview而不是listview


它应该是注释,而不是回答它应该是注释,而不是回答尝试以下代码:if(convertView==null){convertView=inflator.inflate(R.layout.griedviewrow,null);}尝试以下代码:if(convertView==null){convertView=inflator.inflate(R.layout.griedviewrow,null);}使用延迟加载或异步任务来解决此问题。请给出一些示例检查我的答案,如果有任何疑问,请告诉我。我已尝试使用[并且它对我有效。。。。。