2016-08-06 17 views
0

Was ich tun möchte, ist meine run() -Methode zu ändern, so dass es verschiedene Variablen erhalten kann. Ich möchte player1life in etwas anderes ändern, so dass ich customHandler.postDelayed (updateTimerThread, 0) verwenden kann; auf einem anderen, wie player2life. Was der Code tut, ist, wenn eine Taste gedrückt wird, ändert eine Variable ihren Wert.Wie ändert man die Variable einer Methode in Runnable?

HINWEIS: Ich bin ein völlig Neuling in Android-Entwicklung.

final android.os.Handler customHandler = new android.os.Handler(); 
    final Runnable updateTimerThread = new Runnable() 
    { 
     public void run() 
     { if(pressed) { 
      player1life--; 
      textView.setText(String.valueOf(player1life)); 
      customHandler.postDelayed(this, 100); 
     } 
     } 
    }; 


    leftButton1.setOnTouchListener(new View.OnTouchListener() { 

     @Override 
     public boolean onTouch(View view, MotionEvent motionEvent) { 


      switch (motionEvent.getAction()){ 
       case MotionEvent.ACTION_DOWN : 
        pressed = true; 
        customHandler.postDelayed(updateTimerThread, 0); 
        leftButton1.setImageResource(R.drawable.arrownewred); 
        winFunction(); 
        break; 
       case MotionEvent.ACTION_UP : 
        pressed = false; 
        leftButton1.setImageResource(R.drawable.arrownew); break; 
      } 
      return true; 
     } 
    }); 

Antwort

1

ich ein XY-Problem riechen ...

Warum nicht ein anderes Runnable für player2life Handhabung? Führe im On-Click-Handler einfach eine if-Anweisung aus, um zu überprüfen, welches Leben dein Spieler verringern soll!

if ... { 
    customHandler.postDelayed(runnableThatHandlesPlayer1Life, 0); 
} else { 
    customHandler.postDelayed(runnableThatHandlesPlayer2Life, 0); 
} 

Und die Runnables können auf diese Weise erklärt werden:

final Runnable runnableThatHandlesPlayer1Life = new Runnable() 
{ 
    public void run() 
    { if(pressed) { 
     player1life--; 
     textView.setText(String.valueOf(player1life)); 
     customHandler.postDelayed(this, 100); 
    } 
    } 
}; 

final Runnable runnableThatHandlesPlayer2Life = new Runnable() 
{ 
    public void run() 
    { if(pressed) { 
     player2life--; 
     textView.setText(String.valueOf(player2life)); 
     customHandler.postDelayed(this, 100); 
    } 
    } 
}; 

Aber der Code ist eine Art verdächtig. Nach meinem Verständnis des Codes wird die Lebensdauer von player1 mit einer Geschwindigkeit von 10/Sekunde verringert, wenn eine Taste gedrückt wird. Es ist komisch.

Es scheint, als ob Sie versuchen, ein Timer-Ding zu erstellen. Versuchen Sie diese Timer Klasse, die ich schrieb. Es soll die Dinge ein wenig einfacher:

import android.os.Handler; 

public class Timer { 
    private Handler handler; 
    private boolean paused; 

    private int interval; 

    private Runnable task = new Runnable() { 
     @Override 
     public void run() { 
      if (!paused) { 
       runnable.run(); 
       Timer.this.handler.postDelayed (this, interval); 
      } 
     } 
    }; 

    private Runnable runnable; 

    public int getInterval() { 
     return interval; 
    } 

    public void setInterval(int interval) { 
     this.interval = interval; 
    } 

    public void startTimer() { 
     paused = false; 
     handler.postDelayed (task, interval); 
    } 

    public void stopTimer() { 
     paused = true; 
    } 

    public Timer (Runnable runnable, int interval, boolean started) { 
     handler = new Handler(); 
     this.runnable = runnable; 
     this.interval = interval; 
     if (started) 
      startTimer(); 
    } 
} 
1

Ist Problem nur über die Notwendigkeit final Variablen in der anonymen inneren Klasse zu bekommen? Wenn dies der Fall ist, können Sie den "Trick" verwenden, ein endgültiges Array der Länge 1 zu verwenden und dann das Element des Arrays zu aktualisieren.

Hier ist ein einfaches Beispiel:

public interface Incrementer { 

    void increment(); 

} 

public class Foo { 

    private int bar = 0; 

    public int getBar() { 
     return bar; 
    } 

    public void increment() { 
     this.bar++; 
     System.out.println("value is now: " + bar); 
    } 


} 

public class Closure { 

    public static void main(String[] args) { 

     System.out.println("hello"); 
     Foo foo1 = new Foo(); 
     Foo foo2 = new Foo(); 

     final Foo[] theFoo = {foo1}; 

     Incrementer incrementer = new Incrementer() { 

      public void increment() { 
       theFoo[0].increment(); 

      } 

     }; 

     incrementer.increment(); 
     incrementer.increment(); 
     incrementer.increment(); 
     theFoo[0] = foo2; 
     incrementer.increment(); 
     incrementer.increment(); 
     System.out.println("foo1 = " + foo1.getBar()); 
     System.out.println("foo2 = " + foo2.getBar()); 

    } 

}