2017-08-10 4 views
0

Folgende Situation:Warten Sie auf 2 Klickereignisse, bis der Vorgang nicht funktioniert.

Ich programmiere ein Domino-Spiel für Android. Zu Beginn des Spiels, wenn kein Bot der Startspieler ist, sollte ein Benutzer zwei Dominos auswählen, die auf das Brett kommen.

Überblick über meine Nicht-Arbeitsansatz:

Definition eines leeren Arraylist, Aufruf einer Funktion, die Click Hörer auf jedem Domino gehören dem Benutzer durch eine while-Schleife gefolgt legt, die nichts tut, sollte nur sein, die Mechanismus, um zu warten, bis der Benutzer zwei Dominos ausgewählt hat. Dieser domino soll in der Arraylist (Zugabe des dominos zu der Arraylist in FirstDominosPickerListener)

Der Code

In der Aktivität gelagert werden:

ArrayList<Domino> starterDominos = new ArrayList<Domino>(); 

    startingPlayer.chooseStartDominos(starterDominos); 

die Funktion:

public void chooseStartDominos(ArrayList<Domino> starterDominos){ 


     ///Every Domino gets a ClickListener 
     for (Domino domino : playerSet){ 
      domino.setOnClickListener(new FirstDominosPickerListener(starterDominos)); 
     } 

     //The idea is to wait until the user has picked two Dominos. With that loop, no UI at all shows up 
     while (starterDominos.size()<2){ 

      Log.v(LOG_TAG," WAIT!!!!"); 
     }   


    } 

Das Problem ist die while-Schleife. Mit der Schleife wird keine Benutzeroberfläche angezeigt, ich bekomme einen leeren weißen Bildschirm, obwohl der Code läuft. In Logcat bekomme ich unendliche "Wait" -Meldungen. Keine Ahnung warum.

Ein zweiter Ansatz, den ich versucht habe, war ein Timer-Task in der Tätigkeit rufen danach überprüft, ob zwei Dominos (durch die Größe der Liste) starterDominos = startingPlayer.chooseStartDominos(starterDominos);

gepflückt wurden erkennen ich, dass nicht, weil das könnte funktionieren läuft in einem anderen Thread und deshalb war es nicht möglich, auf einen Teil der Benutzeroberfläche zuzugreifen. Aber der Mechanismus zur Auswahl der Dominos hat funktioniert. UI zeigte sich und run() endete, nachdem zwei Dominos durch cancel() ausgewählt wurden.

Warum führt die while-Schleife zu diesem Verhalten? Ist der ganze Ansatz falsch und wenn ja, was kann ich tun, dass die App wartet, bis die Dominos ausgewählt wurden und dann fortfahren

+0

Ich könnte vorschlagen, dass Sie ein paar Android-Tutorials durcharbeiten, bevor Sie tauchen. Ich will nicht übermäßig kritisch sein, aber Ihr Code zeigt einen ziemlich grundlegenden Mangel an Wissen darüber, wie Android-Apps funktionieren. – JJF

+0

Ich habe Tutorials gemacht. Kannst du konkreter sein? – Reinmarius

+0

Sie sollten verstehen * warum * die Antwort unter RE Haupt Thread blockiert ist korrekt. Weißt du, was der Hauptthread ist? Weißt du, warum du den Hauptfaden nicht blockieren kannst? Weißt du, was es bedeutet, einen Thread zu blockieren? Weißt du was ein Thread ist? Diese Art von Dingen. – JJF

Antwort

2

Ihre While-Schleife blockiert den Haupt-UI-Thread, so dass nichts gezeichnet oder auf dem Bildschirm aktualisiert werden kann. Sie müssen einen Listener einrichten, wenn ein Benutzer einen Domino auswählt, und dann fortfahren, nachdem ein Benutzer zwei Dominos ausgewählt hat.

0

Sie können eine Klassenvariable in der Aktivitätsklasse ‚userDominoSelectCount‘ benutzen, die ein kurzes Integer-Feld auf 0

initialisiert werden können Sie die onClickListener für Domino in der Aktivität hinzufügen können onCreate Methode selbst:

domino.setOnClickListener(new View.OnClickListener() { 
    @Override 
    public void onClick(View view) { 
     ++userDominoSelectCount; 
     if(userDominoSelectCount == 2){ 

     //initiate AI logic 
     userDominoSelectCount = 0; 
     } 
    } 
}); 

Die Art, wie Sie tun, wird den Haupt-Thread wie in anderen Antwort auf die Frage erwähnt blockieren. OnClicklisteners sollen in einer Ereignisschleife ausgeführt werden und sollten die Benutzeroberfläche im Idealfall nicht blockieren.

Verwandte Themen