2009-05-28 8 views
6

일부 타사 라이브러리를 사용하여 비동기 프로토콜을 통해 서버에 연결하고 응답을 다시받습니다. 예를 들어, 방법은 사용자 이름으로 사용자 ID를 얻기 위해서는 다음과 같습니다Java의 콜백 및 익명 클래스에 대한 도움이 필요합니다.

public int getUserid(String username) { 
     int userid = 0; 

    connection.call("getUserid", new Responder() { 
     public void onResult(final int result) { 
      System.out.println("userid: " + result); 
      //how to assign received value to userid and return it? 
     } 
    }, username); 

    //wait for response 
    while (userid == 0) { 
      try{ 
       Thread.sleep(100); 
      } catch (Exception e) {} 
     } 


     return userid; 
} 

문제는 내가 (후 반환하기 위해) 방법에서 변수를 "용자 ID"로 서버 응답에서 "결과를"반환 할당 할 수 없습니다입니다 . 어떻게 해결할 수 있을까요? 아마 변수 변수가 아닌 클래스 변수에 할당 할 수 있지만 메서드 범위 내에서 유지하여 동시성 문제를 처리 할 필요가 없습니다.

감사합니다.

답변

2

질문을 올바르게 이해하면 익명의 클래스에서 변수를 작성하는 방법을 묻는 것입니다.

익명 클래스는 최종 변수에만 액세스 할 수 있으며 직접 변수를 쓸 수 없습니다.

"충분히 좋은"간단한 솔루션은 하나의 값 필드와 getter 및 setter를 사용하여 ValueBox 클래스의 정렬을 만드는 것입니다. 그런 다음 함수에서 새 변수를 최종 변수로 인스턴스화하고 익명 클래스에 액세스하도록 할 수 있습니다. 익명 클래스는 getter 및 setter를 사용하여 쓰기/읽기를 수행합니다.

변수가 최종 변수라는 사실은 다른 곳에서는 참조를 조준 할 수 없다는 것을 의미하지만 참조 된 개체의 내용을 두 함수에서 변경할 수는 있습니다.

더 큰 문제는 콜백이 호출 될 때까지 기다리는 것입니다. 이러한 종류의 대기 수면은 충분히 좋을 수도 있지만 달성하려는 대상에 따라 시간 초과, 스레드 등을 고려할 수 있습니다.

또한이 모든 것은 사용자가 절대로이 연결을 두 번 호출하지 않는다고 가정합니다. 그렇지 않으면 동기화 모델에서 더 많은 정보를 제공해야합니다.

public int getUserid(String username) { 
     final ValueBox<Integer> userid = new ValueBox<Integer>(); 

     connection.call("getUserid", new Responder() { 
       public void onResult(final int result) { 
         System.out.println("userid: " + result); 
         userId.setValue(result); 
         //how to assign received value to userid and return it? 
       } 
     }, username); 

     //wait for response 
     while (userid.isEmpty()) { 
       try{ 
         Thread.sleep(100); 
       } catch (Exception e) {} 
     } 

     return userid.getValue(); 
} 
+0

감사합니다. 그래도 두 번 이상 호출해야합니다 ... 어떤 Syncronization 모델을 의미합니까,이 ValueBox 객체에서 읽고 쓸 수 있습니까? 꽤 복잡 할 것입니다 ... – serg

+0

문제는 userId를 처리하기 전에 getUserId를 여러 번 호출 할 수 있다는 것입니다 (예 : 처음 100ms 동안 5 개의 호출이 있다고 가정). 그러면 겹쳐 쓰기 등의 위험이 있습니다. 그런 상황에서 무엇을하고 싶습니까? – Uri

+0

아마도 현재 요청이 완료 될 때까지 추가 요청을 처리하지 않을 것입니다. – serg

0

간단한 변화가 java.util.concurrent.SynchronousQueue 같은 것을 사용하는 것입니다

는 여기에 몇 가지 예제 코드입니다. 그러나 아마도 당신 스스로 이벤트 기반 인터페이스를 제공하기를 원할 것입니다.