2012-03-30 58 views
3

我有一个动画在后台运行,并且我想在完成时注册一个回调。动画不是标准的Java动画 - 它是通过jni访问的c动画(所以为此假设它只是对象)。Java中更好的等待语法

动画没有onFinish方法注册,但它确实有一个isDone()方法,它返回一个布尔值如果动画不再运行。要创建回调,我添加了一个可运行的这样:

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

这似乎是它会是这样做的很不好 - 只是有一个循环运行,直到动画完成。这就是说,我的问题是:有什么替代或首选的方式等待,直到isDone()返回true才能执行我的回调?

+1

有没有办法发出一个线程中的JNI调用d在完成后通知对象? JNI调用是否在后台执行? – Gray 2012-03-30 21:36:08

回答

2

基本上,如果你没有对Animation类的控制权,并且它只提供isDone()方法,唯一的办法就是你做了什么(但是使用Thread.sleep一定的时间,比如10或50女士)。

否则,您可以使用以下方法之一组织它:

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

你可以使用订阅模式。你会注册一个回调动画,以便当动画结束时,它会执行你的回调。

如果您的动画位于可运行内容或可调用对象内,另一个选项可以是使用Futures

1

如果你不能改变动画类使用

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

但是,如果你可以在动画的最后更改动画行为则(当isDone开始回归真实的)添加如下内容:

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

而是while循环,你可以使用

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