French Plantages dus à des images dans des panels

shlomole

Member
Licensed User
Longtime User
Bonjour à tous

Je suis orthophoniste et je me remets au développement après une pause de 20 ans. Ca me change un peu du MSX ;-)

J'ai créé une application éducative qui compte 7 activités : une pour le menu d'accueil et 6 exercices. Chaque exercice contient 3 panels. Depuis que j'ai mis des fonds d'écrans en jpg dans les panels, j'ai des plantages incompréhensibles.

Mais ils ne surviennent pas immédiatement : il faut d'abord que l'utilisateur utilise 3 exercices, en moyenne. Au 4ème, ça plante. Dans l'émulateur, j'ai ce message : "Sorry ! The application has stopped unexpectedly. Please try again", avec un bouton "Force close".

Dans ma tablette (une Acer A500), le message est différent :
"An erroor has occured in sub:machin_activity_create
java.lang.RuntimeException: Object should first be initialized (ImageView).
Continue?"

Bien entendu, l'imageview est initialisée, puisqu'il suffit de quitter et de revenir pour que ça fonctionne. Quel que soit le message, le fait de planter après 3 exercices fait penser à une sorte de saturation, mais où ? Y a-t-il quelque chose à vider quand on quitte une activité ?

Merci d'avance !
Guillaume
 
Last edited:

shlomole

Member
Licensed User
Longtime User
Merci pour ta réponse. Je n'ai pas écrit de code pour charger ces trois fichiers jpg : je me suis juste servi du designer. J'ai utilisé la propriété "bitmapdrawable" sur les 3 panels. Mes exercices commencent comme ceci, après les habituels sub process globals et sub globals (qui contient toutes mes déclarations de variables) :

Sub Activity_Create(FirstTime As Boolean)
Activity.LoadLayout("VraiFaux")
pnlAffichageMots.Visible = False
pnlResultats.Visible = False
End Sub

Sub Activity_Resume
End Sub

Sub Activity_Pause (UserClosed As Boolean)
End Sub

Sub btnLancerJeu_Click
pnlPresentation.Visible = False
pnlAffichageMots.Visible = True
pnlResultats.Visible = False
btnRevenirMenu.visible = False
etc...
 
Last edited:

shlomole

Member
Licensed User
Longtime User
Les images font environ 600x900. J'ai voulu avoir une taille intermédiaire entre 480x800 et les résolutions des tablettes, pour éviter une pixellisation trop importante sur les tablettes.

Concernant les panels, je ne joue effectivement qu'avec la propriété "visible", pour passer de l'un à l'autre : un panel de présentation de l'exo, un panel d'exo proprement dit, puis un panel de résultats.

EDIT : Je viens de tenter de diviser toutes mes tailles d'images par 2 (donc 4 fois moins de pixels) : c'est maintenant stable, mais flou. On dirait bien que tu as mis le doigt sur le problème, merci beaucoup ! Serait-ce une limitation du système ?
 
Last edited:

Informatix

Expert
Licensed User
Longtime User
Les images font environ 600x900. J'ai voulu avoir une taille intermédiaire entre 480x800 et les résolutions des tablettes, pour éviter une pixellisation trop importante sur les tablettes.

Concernant les panels, je ne joue effectivement qu'avec la propriété "visible", pour passer de l'un à l'autre : un panel de présentation de l'exo, un panel d'exo proprement dit, puis un panel de résultats.

EDIT : Je viens de tenter de diviser toutes mes tailles d'images par 2 (donc 4 fois moins de pixels) : c'est maintenant stable, mais flou. On dirait bien que tu as mis le doigt sur le problème, merci beaucoup ! Serait-ce une limitation du système ?

Une image de 600x900 occupe en mémoire 600x900x4 = 2 160 000 octets. Sur un téléphone ordinaire, avec une VM heap size max de 32 Mo, tu peux afficher en théorie 32*1024*1024/2160000 = 15 images. En réalité, c'est moins car il faut aussi stocker dans cet espace le code du programme et les autres données. De plus, les images ont besoin d'une zone continue (non fragmentée) de la mémoire. Donc en pratique, c'est plutôt 11 ou 12 images. Suivant comment ton programme est conçu et suivant ce que tu fais de ces images, tu vas probablement consommer à un moment donné le double de la mémoire requise (pour faire une copie de l'image), ce qui va encore réduire le nombre.
Bref, dès qu'on touche aux images, il faut nécessairement se préoccuper de la gestion de la mémoire. C'est encore plus vrai sur tablette où la mémoire allouée à chaque programme est faible en comparaison de la résolution de l'écran.
 

Informatix

Expert
Licensed User
Longtime User
Une solution possible à ton problème pour garder des images en haute résolution:
- ne charge l'image que quand le panel est visible;
- quand le panel n'est plus visible, décharge l'image en affectant Null à la propriété background de ton panel (ou de l'imageview si tu en utilises une);
- si tu as utilisé une variable de type bitmap pour charger ton image, utilise toujours la même pour charger toutes les images (il faut la déclarer dans Globals donc).
 
Top