2012-03-30 2 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 호출이 백그라운드에서 실행됩니까? – Gray

답변

2

기본적으로 Animation 클래스를 제어 할 수없고 isDone() 메서드 만 제공하는 유일한 방법은 사용자가 수행 한 작업입니다 (그러나 10 또는 50과 같은 특정 시간 동안 Thread.sleep 사용). ms).

그렇지 않으면 다음 방법 중 하나를 사용하여 구성 할 수 있습니다 :

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

당신은 구독 패턴을 사용할 수 있습니다. 애니메이션이 끝나면 콜백을 실행하도록 콜백을 애니메이션에 등록합니다.

애니메이션이 실행 파일 또는 호출 가능 파일 내에있는 경우 다른 옵션으로 Futures을 사용할 수 있습니다.

1

당신은 애니메이션 클래스를 사용

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

을 변경할 수 없습니다하지만 당신은 애니메이션의 끝에서 다음 애니메이션 동작을 변경할 수있는 경우 (때 true가 돌려 시작의 isDone) 같은 것을 추가하는 경우 :

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

대신 루프 동안 당신은 스레드에서 JNI 호출을 발행 할 수있는 방법은 없습니다

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