2017-05-07 2 views
1

Android에서 특정 코드의 실행을 어떻게 보장 할 수 있습니까? Java 보증 콜백 주문 실행

는 여기

Init() { 
    ParseQuery<ParseObject> query = ParseQuery.getQuery("MyTable"); 
    query.getInBackground("ObjectID", new GetCallback<ParseObject>() { 
     public void done(ParseObject object, ParseException e) { 
      // [ ... some code ... ] <----------. 
     } //          | 
    }); //          | 
    // I'd like this is executed after this -----' 
} 

그래서 나는이 시도 코드는, 구문 분석 API 쿼리가 완료된 후 다른 스레드에서 실행됩니다 비동기 콜백, 일을 가지고 있지만 작동하지 않았다, 차단하는 경우 세마포어를 획득하지 않은 스레드에 출시되기 때문에 세마포어

private final Semaphore available = new Semaphore(1, true); 
Init() { 
    try { 
     available.acquire(); 
     ParseQuery<ParseObject> query = ParseQuery.getQuery("MyTable"); 
     query.getInBackground("ObjectID", new GetCallback<ParseObject>() { 
      public void done(ParseObject object, ParseException e) { 
       // [ ... code ... ] 
       available.release(); 
      } 
     }); 
     available.acquire(); // waits till release 
     available.release(); 
    } catch (InterruptedException e) { 
     e.printStackTrace(); 
    } 
} 

가인가 두 번째 시간을 확보하려고? 이 솔루션을 수정하는 방법?

그러나 나는 또한 문제

private static volatile Boolean available = false; 
Init() { 
    available = false; 
    ParseQuery<ParseObject> query = ParseQuery.getQuery("MyTable"); 
    query.getInBackground("ObjectID", new GetCallback<ParseObject>() { 
     public void done(ParseObject object, ParseException e) { 
      // [ ... some code ... ] 
      available = true; 
     } 
    }); 
    while (available == false); 
} 

해결이 더미 방법을 시도하지만 루프 내부 차단 작동하지 않았고, 콜백이 실행되지 않습니다. 이 루프에서 루프를 제거하면 콜백이 실행되므로 루프와 관련된 문제 여야합니다.

+0

특정 순서를 원할 경우 비동기를 사용하는 이유는 무엇입니까? – EJP

답변

0

일반적으로 CountDownLatch으로 처리합니다.

Init() { 
    ParseQuery<ParseObject> query = ParseQuery.getQuery("MyTable"); 
    final taskFinishedLatch = new CountDownLatch(1); 
    query.getInBackground("ObjectID", new GetCallback<ParseObject>() { 
     public void done(ParseObject object, ParseException e) { 
      try { 
       // [ ... some code ... ] 
      } finally { 
       taskFinishedLatch.countDown(); 
      } 
     } //          | 
    }); //          | 
    taskFinishedLatch.await(); 
    // alternatively, you can use timeouts, e.g. 
    // taskFinishedLatch.await(5, TimeUnit.SECONDS); 
} 

여기에 하나의 경고가있다 : 당신이 taskFinishedLatch.countDown();가 호출되고 있는지 확인해야합니다 당신이 그것을 사용할 수 있도록 지금까지 내가 확인할 수 있습니다, 그것은 너무 안드로이드 API (here)에 존재합니다. 이것이 내가 시도한 {...} finally {...} 블록을 추가 한 이유입니다.

이 경우에도 충분하지 않습니다. 쿼리가 done 콜백을 호출하지 않을 경우 대소 문자를 처리해야합니다. 나는. error 콜백이 있습니까? taskFinishedLatch.await(5, TimeUnit.SECONDS)과 같은 시간 제한을 사용할 수는 있지만 동작이 조금 흐릿 해집니다.