2016-02-05 1 views
0

J'ai récemment codé un programme "Battleship" comme un projet d'école, et maintenant décidé de faire une version portable et mobile du programme. Maintenant, j'ai presque terminé, le seul problème qui me reste est que je veux un checkBox (évidemment sur le thread de l'interface utilisateur) à afficher en permanence si c'est le tour des joueurs à un moment donné. Dans la version de bureau, j'avais l'habitude de le faire dans un fil séparé, donc je ne bloque pas les choses sur le fil principal. Le code est le suivant:Mettre à jour un "checkBox" à partir d'un thread non-interface utilisateur

public void run() { 
     while (true) { 
      if (ClientCurrentPlayer.currentPlayer == BattleshipMain.myPlayerNumber) { 
       BattleshipMain.yourTurn.setChecked(true); 
      } else if (ClientCurrentPlayer.currentPlayer != BattleshipMain.myPlayerNumber) { 
       BattleshipMain.yourTurn.setChecked(false); 
      } 
      try { 
       Thread.sleep(10); 
      } catch (InterruptedException e) { 
       e.printStackTrace(); 
      } 
     } 
    } 

Cependant, cela renvoie une exception, en indiquant que je ne peux pas mettre à jour d'autres threads vue que celui qui a créé la vue. Après un peu de recherche, il semble que je pourrais résoudre cela avec runOnUiThread. Je ne comprends vraiment pas comment je suis censé faire cela, cependant - si je cours ce code sur le thread de l'interface utilisateur, il bloquerait toutes les entrées, non? Et je ne peux pas exécuter le code sur un thread distinct et exécuter la partie setChecked dans une méthode dans le thread UI, car alors il exécute la méthode sur le mauvais thread, ou je ne peux pas appeler la méthode puisque runOnUiThread ne peut pas être utilisé dans un contexte statique. Je ne comprends pas, s'il vous plaît aidez-moi. Merci d'avance, cependant! :)

Répondre

1

Plutôt que de faire une vérification d'interrogation comme celle-ci, pensez à utiliser un mécanisme piloté par les événements. Vos discussions peuvent simplement attendre sur les événements à venir. Le fil de l'interface utilisateur fait déjà cela avec un qui est lié à l'arrière-scène et vous pouvez tirer parti de cela en créant un Handler sur le thread principal, en attachant votre propre Handler.Callback à et en lui envoyant des messages. Ou, vous pouvez envoyer une instance Runnable au Handler.

Les filets à anneaux comme celui-ci ont l'air très attrayants, mais vous rencontrez des problèmes comme ceux que vous voyez et ils peuvent conduire à des performances médiocres de la batterie.