IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Android Discussion :

Illegal Monitor State Exception


Sujet :

Android

  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Mars 2012
    Messages
    33
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2012
    Messages : 33
    Par défaut Illegal Monitor State Exception
    Voila, dans l'appli que je développe en ce moment, je dois afficher une interface suite à une identification. Je gère bien la communication Client/Serveur lors de l'appui sur le bouton envoyant l'identification au serveur afin de vérifier si celle-ci est correcte.
    Le problème est que l'affichage ne se fait pas et cela me dit :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    java.lang.IllegalMonitorStateException: object not locked by thread before notify()
    Alors voici le code de mon activité concernant la fenêtre d'identification

    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
    public class IdentificationActivity extends Activity implements OnClickListener {
    	Button buttonValider = null;
    	EditText editNom;
    	EditText editPass;
    	private String nom;
    	private String pass;
    	private String reponseConnection;
    	private boolean reponseLue = false;
    	@Override
    	public void onCreate(Bundle savedInstanceState) {
    		super.onCreate(savedInstanceState);
    		setContentView(R.layout.identification);
     
     
    		editNom = (EditText)findViewById(R.id.editTextNom);
    		editPass = (EditText)findViewById(R.id.editTextPass);
    		buttonValider = (Button)findViewById(R.id.buttonValidIdent);
    		buttonValider.setOnClickListener(this);
     
    	}
    	@Override
    	public void onClick(View v) {	// click sur le bouton valider de l'ihm de creation
    		// TODO Auto-generated method stub
     
    		if(v == buttonValider) {
    			nom = editNom.getText().toString();
    			pass = editPass.getText().toString();
    			ClientThread Client = new ClientThread(this);
    			Client.setNom(nom);
    			Client.setPass(pass);
    			Thread cThread = new Thread(Client);
    			cThread.start();
    			while(reponseLue == false) {
    				synchronized(this) {
    				try {
    					wait();
    				}
    				catch(InterruptedException ie) {
    					ie.printStackTrace();
    				}
    				}
    			}
    			notify();
    			if(reponseConnection.equals("OK")) {
    				Intent monIntent = new Intent(this, ConfigurationActivity.class);
    				startActivity(monIntent);
    			}
    		}
     
    	}
    	public void setReponseConnection(String reponseConnection) {
    		this.reponseConnection = reponseConnection;
    	}
    	public void setReponseLue(boolean reponseLue) {
    		this.reponseLue = reponseLue;
    	}
     
     
    }
    Et voici le code de ma classe Thread dans laquelle je redéfinis la méthode run()

    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
    public class ClientThread implements Runnable {
    	private boolean connected;
    	private Object ThreadAppelant; 
    	private String nom;
    	private String pass;
     
    	public void setNom(String nom) {
    		this.nom = nom;
    	}
     
    	public void setPass(String pass) {
    		this.pass = pass;
    	}
     
    	public ClientThread(Object threadAppelant) {
    		super();
    		ThreadAppelant = threadAppelant;
    	}
     
    	@Override
    	public void run() {
    		// TODO Auto-generated method stub
    		try {
    			Log.d("IdentificationActivity", "C: Connecting...");
    			Socket socket = new Socket("192.168.58.22", 1234);
    			connected = true;
    			if(connected) {
    				try {
    					Log.d("IdentificationAcitivity", "C: Sending Command");
    					PrintWriter out = new PrintWriter(new BufferedWriter(new OutputStreamWriter(socket.getOutputStream())), true);
    					BufferedReader rd = new BufferedReader(new InputStreamReader(socket.getInputStream()));
    					out.println("IDENT,"+nom+","+pass);
    					out.flush();
    					Log.d("IdentificationActivity", "C: Sent");
    					if(ThreadAppelant instanceof IdentificationActivity)
    					{
    						IdentificationActivity ident = (IdentificationActivity)ThreadAppelant;
    						ident.setReponseConnection(rd.readLine());
    						ident.setReponseLue(true);
    						ident.notify();
    					}
    				}
    				catch(Exception e) {
    					Log.e("IdentificationActivity", "S: Error", e);
    				}
    			}
    			socket.close();
    			Log.d("IdentificationAcitivty", "C: Closed");
    		}
    		catch(Exception e) {
    			Log.e("IdentificationActivity", "C: Error", e);
    			connected = false;
    		}
     
    	}
     
    }

  2. #2
    Expert confirmé

    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Février 2007
    Messages
    4 253
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Février 2007
    Messages : 4 253
    Billets dans le blog
    3
    Par défaut
    Oui il faut faire un synchronized sur l'objet avant d'appeler notify...

    Mais il me semble avoir déjà fait le commentaire dans le même sens: Les threads dans le cas ici ne servent à rien....

    Voila ce que tu fais:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    Thread A (UI)                      Thread B
         Crée le thread B                   -
         Exécute le thread B              [newly created]
         Wait                                  commence à travailler
            |                                   |
            |                                   thread A notification
         Finit le traitement de B
    Ca n'apporte absolument aucun gain !!! Autant mettre tout le code du thread B à la place du wait !

    L'interet de faire du multi-threadign (dans ce cas particulier) est de laisser le thread A continuer à s'occuper de l'UI (bouton "back", clicks sur les boutons, etc...) donc ne *surtout pas* faire de wait dessus...

Discussions similaires

  1. SQLite Exception : inconsistent internal state
    Par Pasokoniidesuka dans le forum JDBC
    Réponses: 0
    Dernier message: 06/03/2012, 22h38
  2. [exception] No such state 0
    Par maysam dans le forum Wildfly/JBoss
    Réponses: 0
    Dernier message: 14/04/2009, 12h00
  3. Hibernate Exception Illegal attempt
    Par matthedemon dans le forum Hibernate
    Réponses: 2
    Dernier message: 26/05/2008, 15h34
  4. Réponses: 3
    Dernier message: 28/02/2007, 16h21

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo