2017-09-22 2 views
0

Je ces varibles:variable est accessible à partir de la classe intérieure

private boolean MineRunning; 
private BigInteger MineProfit; 
etc.... 

Je veux appeler la méthode du compte à rebours:

countdown(MineRunning, MineProfit, MineTime, MineProgressbar, MineProgressstatus); 

ca. 10 fois pour des choses différentes

La méthode:

private void countdown(boolean running, BigInteger profit, BigInteger time, ProgressBar progressBar, int progressStatus) { 
    if(!running && Reference.Storage_Filled.add(profit).compareTo(Reference.Storage_Capacity) == 0 || 
      !running && Reference.Storage_Filled.add(profit).compareTo(Reference.Storage_Capacity) == -1){ 
     running = true; 

     new CountDownTimer(time.longValue(), Reference.countDownInterval.longValue()){ 
      public void onTick(long millisUntilFinished){ 
       progressStatus++; 
       progressBar.setProgress(progressStatus); 
      } 

      public void onFinish(){ 

       Reference.totalGravel = Reference.totalGravel.add(profit); 
       Gravelrefresh(); 

       progressStatus = 0; 
       progressBar.setProgress(progressStatus); 

       running = false; 
      } 
     }.start(); 

    } 
} 

Si j'appelle cette méthode que je reçois une erreur:

variable is accessed from within inner class

Je ne veux pas faire les varibles à final parce que je dois modifier ceux-ci dans la méthode. Que puis-je faire à la place? Merci.

Répondre

0

Si votre classe interne exécute un travail sur un thread séparé, ce qui semble être le cas ici, vous ne pouvez pas accéder aux variables de cette classe interne. Ce que vous pouvez faire cependant, vous pouvez passer ces variables en tant que paramètres à votre constructeur de classe interne, créer de nouvelles variables, les copier et les manipuler. Ou vous les déclarez comme définitifs, ce n'est pas un problème la plupart du temps.

0

Toute variable accédée par une classe interne doit être finale ou être une variable de portée de classe. Il n'y a pas de chemin aux alentours. Ne mettez pas à jour ces variables ou suivez les règles. L'ajout de final n'est normalement pas un problème.

Final ne vous empêche pas de muter un objet, il vous empêche juste d'assigner à la référence. Vous pouvez toujours appeler une fonction comme setProgress qui change son état interne.

+0

Si je fais la course finale = false; ne fonctionne pas –

+0

Cela ne fonctionnera pas de toute façon - vous avez une fonction asycnhronous essayant d'accéder et de modifier une variable locale. C'est impossible. C'est pourquoi la règle existe. Courir doit être une variable de niveau de classe, pas un paramètre à une fonction –

0

si vous faites ces variables statiques

private static boolean MineRunning; 
private static BigInteger MineProfit; 
... 

et faites votre paramètre de méthode moins

private void countdown(){ 
    //Your code here 
} 
+0

Je l'ai déjà mais je dois écrire la méthode de compte à rebours 15 fois –

+0

Pourquoi devriez-vous? Je crois que tout fonctionne probablement jusqu'à ce que les variables DECLARING et la méthode soient dans la même classe. – Journey

+0

Parce que je veux une fois pour emaple: compte à rebours (Mine ...) et compte à rebours une fois (Pelle ...) chaque fois différentes valeurs –