2016-04-02 12 views
0

Ist es möglich, ein Attribut aus einer Klasse, die die Runnable-Schnittstelle implementiert, über die Zeit hinweg zu ändern?Ändern eines Runable-Klassenattributs über die Zeit

Ich habe eine Game-Loop in einer GamePanel-Klasse erstellt, die die Runnable-Schnittstelle implementiert. jedoch, wie ich erwartet hatte, es unmöglich ist, eine Boolesche Attribut wie folgt zu ändern:

public class GamePanel extends SurfaceView implements Runnable { 
    private volatile boolean _isPaused; 
    public synchronized void setPause(boolean b) { 
     _isPaused = b; 
    } 

    public synchronized boolean getPause() { 
     return _isPaused; 
    } 

    @Override 
    public void run() { 

     while (!_isPaused) 
      draw(); 
    } 

    public void draw() 
    { 
     if (_isPaused) 
      drawPauseScreen(); 
     else 
      drawGameScreen(); 
    } 
} 

In meinem MainActivity, ich habe einen Zuhörer zu einem einfachen Knopf angebracht:

private View.OnClickListener buttonPauseListener = new View.OnClickListener() { 

    @Override 
    public void onClick(View v) { 
     _gamePanel.setPause(!_gamePanel.getPause()); 
    } 

}; 

Wenn ich auf die Pause-Taste, der Boolesche Wert wird geändert, aber das Klicken auf eine Sekunde wird den Booleschen Wert nicht mehr ändern.

+0

Sie setzen immer den _isPaused Wert, in der onClick sollten Sie dies nicht tun? _gamePanel.setPause (! _ gamePanel.getPause()); – jonathanrz

+0

Ich habe den Code bearbeitet, es war ein Tippfehler. Ich habe: _gamePanel.setPause (! _ GamePanel.getPause()); und das funktioniert nicht –

Antwort

1

Sie können den Booleschen Wert so ändern, wie Sie es tun, aber ich bedenke, dass ich nicht den Best Practices folge.

Ihr aktuelles Problem besteht darin, dass Sie die while-Schleife beenden, also läuft das runnable nicht mehr, sobald Sie den booleschen Wert auf true setzen, damit er nicht mehr zeichnet.

Edit: Ich würde stattdessen eine AtomicBoolean empfehlen, um den Code klarer zu machen.

+0

Ich denke, ich bin müde, einen solchen dummen Fehler zu posten. Danke –

+0

Passiert uns allen :) Vielleicht haben Sie sie und sind nur nicht einschließlich, aber ein Tipp wäre, etwas Protokollierung zu haben. Zum Beispiel wenn Sie: 1) Eingabe runnable 2) Runnable beenden –

Verwandte Themen