2016-02-06 1 views
1

J'ai une variable locale dans ma méthode externe que je veux changer d'une classe interne anonyme. Comment puis-je le faire?Comment changer la variable externe d'une classe interne anonyme?

J'ai essayé la solution à l'aide d'un tableau à une de l'élément décrit here

public class outerClass{ 
    static public void outerMethod(Interface interface) { 
     final String[] variable = new String[1]; 
     new Thread(new Runnable() { 
      @Override 
      public void run() { 
       variable[0] = "Hello"; 
       Log.i("test", variable[0]); // Works, prints "Hello" 
      } 
     }).start(); 
     Log.i("test", variable[0]); // Doesn't work, null string 
    } 
} 

et la solution en utilisant un support décrit here

public class outerClass{ 
    static public void outerMethod(Interface interface) { 
     final Holder<String> variable = new Holder<String>; 
     new Thread(new Runnable() { 
      @Override 
      public void run() { 
       variable.held = "Hello"; 
       Log.i("test", variable.held); // Works, prints "Hello" 
      } 
     }).start(); 
     Log.i("test", variable.held); // Doesn't work, null string 
    } 
} 

class Holder<String> { 
    public String held; 
} 

, mais les deux ne fonctionnent pas dans mon cas pour une raison quelconque.

Cela peut être pertinent, mais ce qui est différent, c'est que ma méthode externe est statique. J'ai également simplifié mon code ici, le code original était pour un cours de Callback anonyme de la bibliothèque Retrofit sur Android.

+2

Est-ce que vous créez et lancez un 'Thread' pour exécuter votre' Runnable'? – rgettman

Répondre

3

Vous créez une classe Runnable, mais elle ne s'exécute jamais réellement. Vous devez le "démarrer" en appelant sa méthode start(). Mais vous devez également garder à l'esprit que lorsque vous le lancez à l'intérieur de outerMethod(), il peut ne pas s'exécuter avant que la méthode Log soit appelée (car elle sera exécutée dans un thread séparé) et l'ordre dans lequel le code est appelé n'est plus garanti.

+0

Ce n'est pas mon code actuel, je l'ai simplifié donc j'ai oublié de mettre le début. Si tout va bien, voulez-vous que je mette le code réel à la place? –

+0

J'ai modifié ma réponse pour un commentaire supplémentaire sur les threads et l'ordre dans lequel le code suivant est exécuté. – radoh

+0

Merci beaucoup c'était bien le problème! Le journal a été exécuté avant que le thread ne modifie la variable. J'ai ajouté une jointure() au thread pour attendre jusqu'à ce qu'il se termine pour imprimer le journal, et cela fonctionne maintenant comme un charme! –

0

Vérifiez la synchronisation de vos threads. Utilisez Object.wait() ou mot-clé synchronisé. Votre thread principal n'attend pas que le nouveau thread créé initialise la variable. Il devrait attendre que cela se termine.

Et en passant, votre classe ne pouvait pas être classe intérieure. Voir here