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

Langage Java Discussion :

Listener et WeakReference null ?


Sujet :

Langage Java

  1. #1
    Membre éclairé Avatar de BakaOnigiri
    Inscrit en
    Avril 2002
    Messages
    366
    Détails du profil
    Informations forums :
    Inscription : Avril 2002
    Messages : 366
    Par défaut Listener et WeakReference null ?
    bonjour,

    j'ai un petit problème, j'ai créé un pseudo object graphique (une surcharge d'un JPanel avec plusieurs composants dedans)

    j'ai rajouté cette méthode :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    public void addActionListener(ActionListener listener)
    {
        actionListenerList.add(new WeakReference<ActionListener>(listener));
    }
    Le tout va avec la définition de la liste des listeners, et d'autre bout de code qui vont avec :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    private ArrayList<WeakReference<ActionListener>> actionListenerList = new ArrayList<WeakReference<ActionListener>>();
     
    public void removeActionListener(ActionListener rlistener)
    {
    	for(WeakReference<ActionListener> listener : new ArrayList<WeakReference<ActionListener>>(actionListenerList))
    	{
    		if(listener != null && listener.get() != null && listener == rlistener)
    		{
    			actionListenerList.remove(listener);
    		}
    	}
    }

    Quand je dois notifier mes abonnés, j'utilise ce code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    System.out.println("taille liste : " + actionListenerList.size());
    for(WeakReference<ActionListener> listener : actionListenerList)
    {
    	System.out.println("listener...");
    	if(listener != null && listener.get() != null)
    	{
    		System.out.println("OK -> notification");
    		listener.get().actionPerformed(evt);
    	}
    }

    et je m'enregistre auprès de ce composant comme çà :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    myComp.addActionListener(new ActionListener()
    {
    	@Override
    	public void actionPerformed(ActionEvent e)
    	{
    		System.out.println("plop");
    	}
    });

    Voici mon problème : quand je suis en debug tout ce passe bien, quand je suis en mode normal : est faux, donc je notifie personne.

    Je ne comprend pas bien pourquoi la référence passe à null quand je ne suis pas en debug.

    Avez-vous une idée ? merci d'avance.

  2. #2
    Rédacteur/Modérateur
    Avatar de Logan Mauzaize
    Homme Profil pro
    Architecte technique
    Inscrit en
    Août 2005
    Messages
    2 894
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Architecte technique
    Secteur : Transports

    Informations forums :
    Inscription : Août 2005
    Messages : 2 894
    Par défaut
    Déjà le code est erroné, tu compares ta WeakReference avec le listener en paramètre lors du remove.

    Une WeakReference permet justement de ne pas maintenir une "strong reference" sur une instance, ce qui permet potentiellement de la libérer : la méthode "get()" renvoie donc null.

    C'est une mauvaise idée d'utiliser des WeakReference pour stocker des Listener car en général il n'y a que le composant qui le référence, ce qui veut dire que tu es voué à perdre tes Listener.
    Java : Cours et tutoriels - FAQ - Java SE 8 API - Programmation concurrente
    Ceylon : Installation - Concepts de base - Typage - Appels et arguments

    ECM = Exemple(reproduit le problème) Complet (code compilable) Minimal (ne postez pas votre application !)
    Une solution vous convient ? N'oubliez pas le tag
    Signature par pitipoisson

  3. #3
    Membre éclairé Avatar de BakaOnigiri
    Inscrit en
    Avril 2002
    Messages
    366
    Détails du profil
    Informations forums :
    Inscription : Avril 2002
    Messages : 366
    Par défaut
    Oui, en effet le remove ne sert plus, c'est un reste que j'ai machinalement mis à jour à partir du moment ou j'ai commencé à migrer mes listeners en weakreference.

    Je comprend maintenant pourquoi ma référence se vide, en fait je donne à mon objet un ActionListener qui n'est gardé que par lui, donc il disparait.

    Désolé, erreur d'étourderie.

    Merci.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Custom listener toujours null
    Par C/C++ dans le forum Android
    Réponses: 1
    Dernier message: 30/09/2014, 17h44
  2. PROBLEME AVEC LES REQUETES IS NULL / NOT EXISTS
    Par sylvaine dans le forum Langage SQL
    Réponses: 5
    Dernier message: 04/06/2004, 13h26
  3. [VB6] [BDD] Recordset et champ égal à Null
    Par Gr|ppen dans le forum VB 6 et antérieur
    Réponses: 3
    Dernier message: 07/03/2003, 10h00
  4. DoubleClick Listener & ENTER
    Par Pro_Fete dans le forum Composants
    Réponses: 4
    Dernier message: 27/01/2003, 13h23
  5. "ALTERER" une col. NULL en NOT NULL - Int
    Par Gandalf24 dans le forum SQL
    Réponses: 2
    Dernier message: 28/12/2002, 00h07

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