2017-04-10 1 views
0

j'ai une fonction, jouabilité(), qui se présente comme suit: Paramètregestionnaire applications en cours d'exécution de façon asynchrone

public void gamePlay() 
{ 
    for (int i = 0; i < 4; i++) 
    { 
     currentRound = i; 
     if (i == 0) 
     { 
      simulateTurns(); 
     } 
     if(i == 1) 
     { 
      simulateTurns(); 
     } 
     if (i > 1) 
     { 
      simulateTurns(); 
     } 
    } 
} 

simulateTurns() utilise un gestionnaire instancié avec le Looper.getMainLooper() comme suit avant jouabilité() est jamais appelé:

thread = new Handler(Looper.getMainLooper()); 

simulateTurns():

public void simulateTurns() 
{ 
    currentPlayer = players[playerIndex % numPlayers]; 

    if(currentPlayer.getPlayerID() == USER_ID) //user 
    { 
     if(!currentPlayer.hasFolded()) 
      showUserOptions(currentRound); 
     else 
     { 
      playerIndex++; 
      simulateTurns(); 
     } 
    } 
    else 
    { 
     hideUserOptions(0); 

     // Give players the option to raise, call, fold, checking (dumb for now, needs AI and user input) 
     // currentPlayer.getPlayerID() gets the current ID of the player 
     int randAction = (int) (Math.random() * 4); 
     String action = ""; 


     //DEBUG Simulate game 
     Log.w("--------DEBUG--------", "Round: " + currentRound + " Bot: " + currentPlayer.getPlayerID() + " action: " + action + " pot: " + pot); 

     thread.postDelayed(new Runnable(){ 
      public void run() 
      { 
       if(!betsEqual()) 
        simulateTurns(); 
      }}, 5000); 
    } 
} 

Lors du débogage du journal, tous les tours voir m pour commencer en parallèle et ensuite quelques tours du tour 3 sont enregistrés.

Comment est-ce que je peux synchroniser la boucle for avec simulateGame() afin que les rounds fonctionnent dans l'ordre?

Remarque: J'appelle également simulateTurns() sur quelques onClickListeners.

+0

J'ai trouvé votre code assez confus. Peut-être que vous devriez envisager de le redéfinir – nandsito

+0

Il y a un désordre, mais thread.postDelayed peut-être votre problème. Qu'est-ce que vous voulez est d'arrêter/pause/sommeil pendant 5 secondes à chaque fois, est-ce exact? Si cela, changez ce code, le gestionnaire ne fonctionne pas comme ceci. –

Répondre

1

Votre code semble confus. Si vous essayez de simuler un tour dans l'ordre, vous ne devriez pas utiliser les fonctions asynchrones, car elles sont destinées à être asynchrones, et vous ne recherchez pas ce comportement. En supposant que vous essayez de faire des choses asynchrones parce que vous attendez que les choses arrivent (ou parce que vous ne voulez pas bloquer le thread d'interface utilisateur), vous devrez faire quelques changements avant de tout faire.

Vous utilisez une variable globale pour le nombre d'arrondis. Cela signifie que votre boucle exécute très rapidement tout ce qui est lancé alors l'appel asynchrones est exécuté, donc la variable est max (3) pour tous les appels.

Vous devriez avoir une fonction appelée "StartNextRound()" qui est appelée à la fin de votre "simulateTurn()". Cette fonction devrait vérifier alors qu'il est nécessaire de commencer un nouveau cycle (i < 4) puis appeler une nouvelle instance de votre simulateTurn(). Résumons ceci: ne lancez pas la tâche asynchrone avant qu'elle ne soit nécessaire. Utilisez une fonction pour lancer un nouveau cycle et appelez cette fonction à la fin du tour précédent.

C'est la façon la plus simple de gérer l'asynchrone. Les autres options sont plus compliquées (et probablement pas efficaces en termes de mémoire) et impliquent des gestionnaires entre les threads afin de pouvoir lancer toutes les tâches en même temps et les faire dormir jusqu'à ce que le tour correct soit lancé. C'est un travail très dur pour garder quelque chose qui n'est pas vraiment correct (et qui semble être là "à des fins de test").

+0

votre deuxième suggestion m'a aidé à faire fonctionner mon programme. Merci beaucoup! – user3217494

+0

Alors pouvez-vous accepter la réponse, ou expliquer ce que vous avez fait pour d'autres lecteurs? – Feuby

+0

Je l'ai fait exactement comme vous l'avez fait, lancez les tours avec des appels de fonction à l'intérieur de simulateTurns() – user3217494