Лучший синтаксис ожидания в Java - PullRequest
3 голосов
/ 31 марта 2012

У меня работает анимация в фоновом режиме, и я хочу зарегистрировать обратный вызов, когда это будет сделано.Анимация не является стандартной анимацией Java - это анимация переменного тока, доступ к которой осуществляется через jni (поэтому предположим, что она имеет тип Object ).

Анимация не 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 для выполнения моего обратного вызова?

Ответы [ 3 ]

2 голосов
/ 31 марта 2012

В основном, если у вас нет контроля над классом Animation, и он предоставляет только метод isDone (), единственный способ - это то, что вы сделали (но с Thread.sleep в течение определенного времени, например 10 или 50 мс ).

В противном случае вы можете организовать его, используя один из следующих методов:

  1. ждать / уведомить
  2. CyclicBarrier
  3. Будущее
1 голос
/ 31 марта 2012

Если вы не можете изменить класс анимации, используйте

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

Но если вы можете изменить поведение анимации, то в конце анимации (когда isDone start возвращает true) добавьте что-то вроде этого:

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

и вместо цикла while вы можете использовать

synchronized(animation){
    if(!animation.isDone){
        animation.wait();
    }
}
0 голосов
/ 31 марта 2012

Вы можете использовать шаблон подписки.Вы должны зарегистрировать обратный вызов в анимации, чтобы после завершения анимации он выполнял ваш обратный вызов.

Другой вариант может заключаться в использовании Futures , если ваша анимация находится внутри runnables или вызываемых элементов.

...