Bonjour,

J'ai implémenter une MIDlet qui permet de discuter avec un application serveur également en Java. Mon problème est le suivant : Lorsque j'envoie des données, je démarre un Timer que j'arrete quand j'ai recue l'acquittement du serveur. Si je ne reçoit rien, le timer déclenche un timeout au bout de 10 secondes. C'est ici que survient le problème. Lorsque mon timer est déclenché, il me fait une exception Out Of Memory.

Voici mes deux class :

Server.java qui permet de communiquer avec le serveur

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
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
package projet.wrk;

import projet.cste.Constantes;
import projet.ctrl.Ctrl;

/**
 * <p>Titre : WorkerNetwork</p>
 *
 * <p>Description : Worker qui permet de lancer le server et le timer </p>
 *
 * <p>Copyright : Copyright (c) 2005</p>
 *
 * <p>Société : EMF</p>
 *
 * @author Clément Valentin
 * @version 1.0
 */
public class WorkerNetwork implements Constantes{

   //Constructeur de WorkerNetwork
   public WorkerNetwork(Ctrl ctrl){
      this.ctrl = ctrl;
   }

   //Démarrage du timer et demande de connexion
   public void connect(String url, String msg){
      server = new Server(this.ctrl);
      server.startServer(url, msg);
   }

   //Méthode qui permet d'envoyer des données
   public void sendCmd(String cmd){
      time = new Timer(10000, this.ctrl);
      time.startTimer();
      server.sendCmd(cmd);
   }

   //Méthode qui permet de recevoir les données
   public String receiveData(){
      String data = server.receiveData();
      time.stop();
      return data;
   }


   //Ferme la connexion et réinitialise le métier server
   public void releaseConn(){
      server.releaseConn();
      server = new Server(this.ctrl);
   }

   public void initThread(){
      server = new Server(this.ctrl);
   }

   /**
    * @directed
    */
   private Ctrl ctrl;

   /**
    * @directed
    */
   private Timer time;

   /**
    * @directed
    */
   private Server server;

}
Timer.java le timer lui même

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
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
 
package projet.wrk;
 
import projet.ctrl.Ctrl;
 
/**
 * <p>Titre : Timer.java</p>
 *
 * <p>Description : Timer qui permet de faire sortir l'application serveur ne répond pas</p>
 *
 * <p>Copyright : Copyright (c) 2005</p>
 *
 * <p>Société : EMF</p>
 *
 * @author Clément Valentin
 * @version 1.0
 */
public class Timer extends Thread{
   //Constructeur de Timer. Initialisation des variables du Timer
   public Timer(int length, Ctrl ctrl){
      this.ctrl = ctrl;
      timeout = length;
      timeelapsed = 0;
   }
 
   //Mise à zéro du Timer
   public void reset(){
      synchronized (this){
         timeelapsed = 0;
      }
   }
 
   //Démarre le Timer
   public void startTimer(){
      running = true;
      this.start();
   }
 
   /*
    * le timer tourne en boucle jusqu'à l'interruption ou le déclenchement du timeout
    */
   public void run(){
      while (running){
         try{
            Thread.sleep(rate);
         }
         catch (InterruptedException ioe){
            continue;
         }
         synchronized (this){
            timeelapsed += rate;
            if (timeelapsed > timeout){
               running = false;
               timeout();
            }
         }
      }
   }
 
   //Initialise la variable running à true
   public void running(){
      running = true;
   }
 
   //Action effectuer lors du déclenchement du timeout
   public void timeout(){
      ctrl.timeout();
   }
 
   //Arret tu timer
   public void stop(){
      running = false;
   }
 
   private boolean running = true;
   private long timeout;
   private long timeelapsed;
   protected long rate = 100;
 
   /**
    * @directed
    */
   private Ctrl ctrl;
}
La méthode timeout appel le contrôleur qui lui appel l'ihm afin de faire cette action

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
 
   public void displayMsg(String msg){
      Alert alert = new Alert("Erreur", msg, null, AlertType.ERROR);
      alert.setTimeout(TIME_FOR_ALERT);
      display.setCurrent(alert);
   }
Si quelqu'un a une idée c'est avec plaisir que je la prend

Merci d'avance