2017-08-03 7 views
0

J'ai le code de minuterie suivant, et basé sur l'exécution de la méthode d'exécution, si elle a réussi ou non, je voudrais retourner un booléen .Méthode appelée dans la méthode d'exécution d'une minuterie renvoie une valeur que je dois utiliser en amont

Cependant, j'obtiens le message d'erreur: La variable locale connectée définie dans une étendue englobante doit être finale ou effectivement définitive.

Comment puis-je contourner cela pour accomplir ce que je veux? Voici le code:

private boolean getSwitchesOnRc(NamedPipeClient pipe, DV_RC_EntryPoint rc_EntryPoint, int allowedAttempts, int counter){ 
    final ScheduledExecutorService scheduler = Executors.newScheduledThreadPool(1); 

    boolean connected = false; 
    ScheduledFuture<?> countdown = scheduler.schedule(new Runnable() { 
     @Override 
     public void run() { 
      connected = attemptRetrievalOfSwitches(pipe, rc_EntryPoint, allowedAttempts, counter); 
     }}, 1, TimeUnit.MINUTES); 


    return connected; 
} 

Répondre

0

Vous devez planifier une plutôt appelable qu'un Runnable pour le faire.

Cela ferait ce que vous voulez:

ScheduledFuture<Boolean> countdown = scheduler.schedule(new Callable<Boolean>() { 
    public Boolean call() { 
     return attemptRetrieval(...); 
    }}, 1, TimeUnit.MINUTES); 

return countdown.get(); 

Notez que cette méthode permet de bloquer jusqu'à ce que l'appel programmé est terminé.

1

utiliser seulement appelable insted de Runnable:

<V> ScheduledFuture<V> schedule​(Callable<V> callable, long delay, TimeUnit unit) 
Creates and executes a ScheduledFuture that becomes enabled after the given delay. 
principale différence est

, que peut appelable valeur retournée (directement en appelant la déclaration de retour).

alors au lieu de

return connected; 

sera

return countdown.get(); 
+0

Pouvez-vous s'il vous plaît modifier le code? – Harriet