2009-05-28 62 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

謝謝。它需要被多次調用,雖然...你是指從哪個同步模型讀取/寫入這個ValueBox對象?這將會非常複雜...... – serg 2009-05-28 01:34:07

0

最簡單的變化是使用類似java.util.concurrent.SynchronousQueue。但是可能你想自己提供一個事件驅動的接口。