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éthodesetForm()
- 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éthodesetForm(f)
de laMidlet
.
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...
-
En classe
MIDlet
public void setInfo(Form f) { getDisplay().setCurrent(f); }
-
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;
-
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(); } }