2 votes

Quelles sont les principales raisons de java.lang.OutOfMemoryError sur Android

Je suis nouveau sur Android et Java. J'ai créé une application qui fonctionne bien, sauf que je reçois une exception java.lang.OutOfMemoryError lorsque je fais défiler les listes dans mon application qui s'agrandissent dynamiquement (10 éléments) à chaque fois que je fais défiler jusqu'en bas. Après avoir fait défiler environ 4-5 pages, je reçois cette exception. Est-ce que quelqu'un peut m'aider à résoudre cette exception et me donner quelques conseils pour éviter de telles exceptions.

Mon Adaptateur :

public class LazyAdapter extends BaseAdapter {

    private static LayoutInflater inflater = null;
    private Activity activity;
    public ImageLoader imageLoader;
    public static ArrayList values;
    private String product_action;

    public LazyAdapter(Activity a, ArrayList arg3) {

        values = arg3;
        activity = a;
        inflater = (LayoutInflater) activity
                .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        imageLoader = new ImageLoader(activity.getApplicationContext());
    }

    public int getCount() {

        return values.size();
    }

    public Object getItem(int position) {

        return position;
    }

    public long getItemId(int position) {

        return position;
    }

    public static class ViewHolder {

        public TextView text;
        public ImageView image;
    }

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

        View vi = convertView;
        ViewHolder holder;

        Product p = values.get(position);

        if (convertView == null) {
            vi = inflater.inflate(R.layout.feed_items, null);
            holder = new ViewHolder();
            holder.text = (TextView) vi.findViewById(R.id.label);
            ;
            holder.image = (ImageView) vi.findViewById(R.id.logo);
            vi.setTag(holder);
        } else {
            holder = (ViewHolder) vi.getTag();
        }

        if (condition1) {
            holder.text.setText(myText);
            holder.image.setTag(imageUrl);

            imageLoader.DisplayImage(imgURL, activity, holder.image);
        } else if (condition2) {
            holder.text.setText(myText);
                    holder.image.setTag(imageUrl);
            imageLoader.DisplayImage(imgURL, activity, holder.image);
        } else if (condition3) {
            holder.text.setText(myText);
            holder.image.setTag(imageUrl);

            imageLoader.DisplayImage(imgURL), activity,
                    holder.image);
        }

        return vi;
    }

    public void add(Product product) {

        values.add(product);
    }

}

2voto

itechDroid Points 736

L'erreur java.lang.outofmemory se produit lorsque le dvm n'a pas d'espace mémoire. Ceci est un problème de fuites de mémoire. Une fuite de mémoire se produit lorsque l'application conserve de plus en plus de références vers des objets et ne les libère jamais. Le ramasse-miettes ne collectera donc jamais ces objets et de moins en moins de mémoire libre sera disponible jusqu'à ce que l'on atteigne le point où il n'y a pas suffisamment de mémoire libre pour que l'application fonctionne normalement.

Levée lorsqu'une demande de mémoire est faite qui ne peut être satisfaite en utilisant les ressources de la plate-forme disponibles. Une telle demande peut être faite à la fois par l'application en cours d'exécution ou par une fonction interne de la VM. Une chose de plus à chaque fois que vous faites défiler la liste, la VM a besoin de mémoire pour afficher cette liste afin de libérer l'objet de la liste avec la vue précédente.

Pour résoudre ce problème, créez d'abord un fichier XML dans lequel vous créez un ListView comme ceci (nom du fichier Xml est votrelist.xml):

Créez maintenant un fichier XML dans lequel votre ImageView et TextView sont créés. (Nom du fichier XML : votreimagetextlayout.xml):

Maintenant vous avez votre classe Activity où vous pouvez trouver votre ListView par son id et créer une classe d'adaptateur personnalisée dans laquelle vous pouvez remplir votre liste comme ceci:

public class MobileArrayAdapter extends ArrayAdapter
{
    private final Context context;
    private ArrayList contactNamesList;
    View rowView;
    ImageView imageview;

    public MobileArrayAdapter(Context context, ArrayList contactNamesList) {
        super(context, R.layout.yourimagetextlayout, contactNamesList);
        this.context = context;
        this.contactNamesList = new ArrayList();
        this.contactNamesList.addAll(contactNamesList);
    }

    public View getView(int position, View convertView, ViewGroup parent) {
        LayoutInflater inflater = (LayoutInflater) context
                .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        rowView = inflater.inflate(R.layout.yourimagetextlayout, parent, false);
        TextView textView = (TextView) rowView.findViewById(R.id.label);
        imageview = (ImageView) rowView.findViewById(R.id.logo);
        String findname=contactNamesList.get(position);
        textView.setText(contactNamesList.get(position));
        imageview.setImageBitmap(ur image phto path);
        return rowView;
    }

}

Maintenant dans votre classe Activity trouvez votre ListView par son id:

ListView listview = (ListView)findViewById(R.id.info_list_id);

Il suffit d'instancier la classe d'adaptateur comme ceci:

MobileArrayAdapter mobileadapter = new MobileArrayAdapter(this, yourarraylist);

et ajoutez cet adaptateur dans votre ListView:

listview.setAdapter(mobileadapter);

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X