2009-12-10 4 views
1

Je crée une application Java ME pour Symbian S60 5ème édition et j'ai des problèmes avec la mémoire. Après un certain temps d'exécution de l'application, je reçois l'exception de mémoire insuffisante. Je reçois des images de Google Maps (par le GPS intégré dans le Nokia 5800) et je les montre.Java ME mémoire insuffisante

Je possède ce mis en œuvre comme ceci:

  • classe MIDlet avec la méthode setForm()
  • classe Data qui a un fil qui recueille les informations sur les coordonnées, obtient l'image de Google Maps, crée une nouvelle forme, ajoute le image, et appelle la méthode setForm(f) à partir du Midlet.

Probable que le Display.setCurrent(Form f) conserve des références sur les formulaires et, ainsi, la mémoire est rapidement saturée. J'ai essayé avec Canvas mais il a une interface utilisateur stupide (un cercle et quelques 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 la localisation et obtient l'image de carte

    private attributes: 
        private Form f=null; 
        private ImageItem imageItem=null; 
        private Image img = null; 
    
  3. méthode locationUpdated dont je s appelé quand recieve 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(); 
        } 
    } 
    
+0

J'ai eu un problème similaire, mon sw fonctionnait sur Palm T3, donc ce que je concluais, je pouvais prolonger la vie de l'application en étant agressif avec les ressources de location, toutes les variables inutiles = null tout vector.clear() quand inutile. .. VM était IBM J9 qui n'était pas quelque chose de sérieux du tout, mais il fonctionnait en quelque sorte. –

+0

Le problème est résolu. J'ai trouvé que c'est possible le clavier virtuel sur Canvas donc j'ai utilisé canvas, et j'ai aussi mis toutes les références sur mapImage = null. Alors maintenant tout est ok avec la mémoire. Merci à tout le monde pour l'aide, Milan Dojčinovski – Milan

Répondre

1

sont des références que vous garder les formulaires ou les images? Ceux-ci les empêcheront d'être collectés et entraîneront des erreurs de mémoire insuffisante.

Il est difficile de dire sans un code source. Quoi qu'il en soit, il vaudra mieux réorganiser votre Midlet pour ne pas créer de nouvelles formes, mais pour réutiliser la même.

Questions connexes