1 votes

Java ME n'a plus de mémoire

Je réalise une application Java ME pour Symbian S60 5th edition et j'ai un problème de mémoire. Après un certain temps d'exécution de l'application, je reçois l'exception "out of memory". Je récupère des images de Google Maps (par le GPS intégré dans le Nokia 5800) et je les affiche.

J'ai implémenté cela comme ceci :

  • classe MIDlet avec méthode setForm()
  • classe Data qui possède un thread qui collecte des informations sur les coordonnées, récupère l'image depuis Google Maps, crée un nouveau formulaire, ajoute l'image, et appelle la méthode setForm(f) de la Midlet .

Probable le Display.setCurrent(Form f) garde des références sur les formulaires et comme ça la mémoire se remplit rapidement. J'ai essayé avec Canvas mais il a une interface utilisateur stupide (un cercle et 4 boutons) que je n'aime pas.

Comment puis-je résoudre ce problème ?

PS : le code...

  1. En classe MIDlet

    public void setInfo(Form f)
    {
        getDisplay().setCurrent(f);
    }
  2. en classe TouristData qui collecte des informations sur l'emplacement et obtient une image de la carte.

    private attributes:
        private Form f=null;
        private ImageItem imageItem=null;
        private Image img = null;
  3. méthode locationUpdated qui est appelé lors de la réception d'un nouvel emplacement :

    public void locationUpdated(LocationProvider provider,final Location location)
    {
        if (!firstLocationUpdate)
        {
            firstLocationUpdate = true;
            statusListener.firstLocationUpdateEvent();
        }
    
        if(touristUI != null)
        {
            new Thread()
            {
                public void run()
                {
                    if(location != null && location.isValid())
                    {
                        //lokacija je, prikaži!
                        try
                        {
                            QualifiedCoordinates coord =location.getQualifiedCoordinates();
                            if(imageItem == null)
                            {
                                imageItem = new ImageItem(null,null,0,null);
                                imageItem.setAltText("ni povezave");
                                f.append(imageItem);
                            }
                            else
                            {
                                img =  googleConnector.retrieveStaticImage2(360,470, coord.getLatitude(), coord.getLongitude(), 16, "png32"); //z markerje
                                imageItem.setImage(img);
                            }
                        }catch(Exception e)
                        {}
                    }
                    else
                    {
                    }
                }
            }.start();
        }
    }

1voto

kgiannakakis Points 62727

Conservez-vous des références aux formulaires ou aux images ? Ces références les empêcheront d'être collectées et provoqueront des erreurs de mémoire.

C'est difficile à dire sans code source. Quoi qu'il en soit, il sera préférable de ré-architecturer votre Midlet non pas pour créer de nouveaux formulaires, mais pour réutiliser le même.

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