Bonjour à tous,

Je développe un Applet dans lequel je vais chercher des images sur une url spécifique pour les afficher.
Or je veux garder afficher une image tant que la suivante n'est pas disponible.

J'ai jusqu'alors utilisé ImageIcon qui semble il intègre Mediatracker :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
 
public void run
{
    while(threadPlayer!=null && this.stopLecture == false)
    {
        if(this.imageloaded)
        {
            this.imageloaded    = false;
            this.getUrlImage();
            ImageIcon img       = new ImageIcon(this.UrlImage);
 
            this.imgFromUrl = img.getImage();
            if(img.getImageLoadStatus() == MediaTracker.COMPLETE)
                this.repaint();
 
            this.imgFromUrl.flush();
            img = null;
 
            try{Thread.sleep(this.fps);}catch (InterruptedException e){}
 
        }
        else
        {
            //Sleep 50ms
        }
    }
}
Cette solution est fonctionnelle mais consomme énormément de mémoire. Sur mon poste java.exe monte jusqu'à 290mo de mémoire avant de se stabiliser (j'affiche jusqu'à 20img/s).

Après quelques recherches j'ai tester ImageIO accouplé à Media tracker :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
 
while(threadPlayer!=null && this.stopLecture == false)
{
    if(this.imageloaded)
    {
 
        this.imageloaded    = false;
        this.getUrlImage();
        try{
            this.imgFromUrl = ImageIO.read(this.UrlImage);
        } catch(IOException e){}
        //Tracker instancié dans init()
        try{
            this.tracker.addImage(imgFromUrl, 1);
            this.tracker.waitForID(1);
        } catch(InterruptedException e){}
 
        if(this.tracker.statusID(1, false) == MediaTracker.COMPLETE)
            this.repaint();
        this.tracker.removeImage(imgFromUrl);
        this.imgFromUrl.flush();
 
        try{Thread.sleep(40);}catch (InterruptedException e){}
    }
    else
    {
        //Do something else
    }
}
Cette fois la consommation mémoire chute pour tourner autour de 50Mo.

Du coup je m'interroge, le fonctionnement final semblant être le même d'ou vient cette différence de mémoire ? ImageIO.read utilise t'il bien mon MediaTracker ou passe t'il outre ?

Deplus si à la place de ImageIO.read() j'utilise simplement Java.applet.Applet.getImage() j'ai le droit à un outofmemory.

Quel solution dois je utiliser ?