2012-03-30 14 views
3

Ich habe eine Animation im Hintergrund ausgeführt, und ich möchte einen Rückruf für den Fall, dass es abgeschlossen ist. Die Animation ist keine Standard-Java-Animation - es handelt sich um eine c-Animation, auf die über jni zugegriffen wird (nehmen Sie also an, dass sie nur vom Typ Objekt ist).Bessere Wartesyntax in Java

Die Animation hat keine OnFinish Methode zu registrieren, aber es hat eine IstFertig() Methode, die einen Booleschen Wert zurückgibt, wenn die Animation nicht mehr läuft. Um den Rückruf zu erstellen, habe ich eine runnable als solche:

class Foo implements Runnable { 
    @Override 
    public void run() { 
     if (animation == null || target == null) return; 
     while (!animation.isDone()) 
     { 
      //loop until animation is done... 
     } 
     //execute callback 
    } 
} 

Dies scheint, wie es eine schlechte Art und Weise, dies zu tun wäre - nur eine Schleife laufen, die bis in der Animation beendet. Das heißt, meine Frage ist: Welche alternativen oder bevorzugten Möglichkeiten gibt es zu warten, bis IsDone() gibt True zurück, um meinen Rückruf auszuführen?

+1

gibt es keine Möglichkeit, Ihre JNI Aufruf in einem Thread eine Verwendung zur Ausgabe von d dann ein Objekt benachrichtigen, wenn es fertig ist? Wird der JNI-Aufruf im Hintergrund ausgeführt? – Gray

Antwort

2

Grundsätzlich, wenn Sie keine Kontrolle über die Animation-Klasse haben, und es nur mit isDone() -Methode bietet die einzige Möglichkeit ist, was Sie getan haben (aber mit Thread.sleep für eine gewisse Zeit, wie 10 oder 50 Frau).

Andernfalls können Sie es einer der folgenden Techniken organisieren:

  1. wait/notify
  2. CyclicBarrier
  3. Future
0

Sie ein Abonnement Muster verwenden könnte. Sie würden einen Rückruf mit der Animation registrieren, sodass der Rückruf nach Beendigung der Animation ausgeführt wird.

Eine andere Option könnte sein, Futures zu verwenden, wenn sich Ihre Animationen in Runnables oder Callables befinden.

1

Wenn Sie keine Animation Klasse Verwendung ändern

while(!animation.isDone()){ 
    Thread.sleep(SOME_TIME); 
} 

Aber wenn Sie Animation Verhalten am Ende der Animation dann ändern können (wenn IstFertig return true Start) so etwas wie hinzufügen:

synchronized(this){ 
    this.notifyAll(); 
} 

und stattdessen while-Schleife können Sie

synchronized(animation){ 
    if(!animation.isDone){ 
     animation.wait(); 
    } 
}