OutOfMemoryException при прокрутке много раз

1

У меня проблема с прокруткой gridview. Я создаю один настраиваемый gridview и вставляю виджет в необработанный файл и раздуваю их через представление. Я получил правильный результат и правильные данные, и все прошло хорошо, но когда я прокручиваю gridview 3-4 раза быстрее, он вызывает OutOfMemoryException.

Это приложение содержит список установленных списков приложений и значков

Вот мой код адаптера custome:

  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 GriedViewAdapter 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 GriedViewAdapter(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.griedviewrow, 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();
             }   */
          }
      }
}

Я думаю, что с getview что-то не getview.

  • 0
    используйте ленивую загрузку или асинхронную задачу для решения этой проблемы.
  • 0
    не могли бы вы привести пример
Показать ещё 2 комментария
Теги:

4 ответа

1

В getView() вы не повторно используете convertView, но всегда раздуваете новый с помощью инфлятора. Это требует большего объема памяти и замедляет работу вашего кода. Кроме того, убедитесь, что вы не пропускаете изображения с помощью imageLoader.

  • 0
    Можете ли вы дать образец
  • 0
    попробуйте этот код: if (convertView == null) {convertView = inflator.inflate (R.layout.griedviewrow, null);}
0

проверьте это видео из google IO http://www.youtube.com/watch?v=wDBM6wVEO70 и прочитайте этот http://developer.android.com/training/displaying-bitmaps/index.html и эту странную проблему с памятью при загрузке изображения в объект Bitmap

0

Скачать код Из следующей ссылки и использовать gridview вместо listview

Пример ленивой загрузки

0

out of memory нехватки out of memory обычно означает, что для загрузки файла недостаточно памяти. попробуйте закрыть все остальное (или, по крайней мере, несколько других приложений) и повторить попытку.

  • 1
    это не решение
  • 0
    Надо комментировать, а не отвечать

Ещё вопросы

Сообщество Overcoder
Наверх
Меню