2011-06-21 23 views
1

我有一個問題。我正在呼叫服務器端的GWT。 調用的結果是一個ArrayList(結果)。內部onSuccess方法另一個 ArrayList包裝結果。但是,如果我想在使用onSuccess方法外使用 ArrayList lista,它包含0個元素, 但內部就像結果ArrayList。我該如何解決它?我試過 使用lista作爲類屬性,靜態屬性,但它不運行 。問題在AsynCallBack - GWT

嗯,我已經改變了我的代碼,但它不運行。我調用另一個方法時的onSuccess叫...

public void addContainers() throws Exception { 
    gwtService.obtainAttributesDevice(1, new AsyncCallback<ArrayList<String>>(){ 
     @Override 
     public void onFailure(Throwable caught) { 
      System.out.println("ERROR"); 
      Window.alert(caught.getMessage()); 
     } 
     @Override 
     public void onSuccess(ArrayList<String> result) { 
      lista.addAll(0, result); 
      addProjectContainers(); 
     }  
    }); 

private void addProjectContainers() throws Exception { 
    RootPanel.get("mainContainer").add(new Label("Array lista 2: "+lista.toString())); 
    RootPanel.get().add(new Label(String.valueOf("Array lista 2: "+lista.size()))); 
    for(int i = 0; i < lista.size(); i++){ 
     RootPanel.get().add(new Label("BOTON "+i)); 
    } 
} 

回答

2

如果它有助於將onSuccess和onFailure的內容看作是與其餘代碼分開運行的線程(它不是一個真正的線程,但它不會與其餘代碼同步運行,爲什麼它被稱爲「異步」)。

這可能有助於保持簡單並避免大量縮進,並且還可以減少需要定義的決賽數量,如果您創建了一個最終或成員變量,並在類中執行異步調用this以便回調可以調用方法來處理響應。

的僞代碼示例(很簡單):

class foo{ 
    protected callingClass = this; 

    void fetchData(){ 
     service.getData(new Callbac(){ 
      onSuccess(List<Data> data){ 
       callingClass.processData(data); 
      } 
     } 
    } 
    void procesData(List<Data> fetchedData){ 
     // Add data etc.. 
    } 
} 

編輯關於大量的代碼調用後:

如果你需要回調之後做大量的「東西」,只是把它放在onSuccess或你在onSuccess調用的方法上(比如在我的示例中)。

如果您需要按順序進行多次回調(重新排序它們會導致錯誤),您應該先製作一個服務方法,將這些操作組合起來(如果可能),或者您應該在onSuccess中執行另一個服務器調用回電話。爲了簡化這一點,避免深度嵌套代碼,您可以使用自定義回調接口來定義一個匿名類,以在調用下一次服務器調用的第一個回調中使用。

我經常使用這個接口來定義一些使用該界面的回調之後進行(或變體形式):

public abstract class AfterCompleteAction { 
    /** 
    * The stuff to do when the method receiving this callback is finished. 
    */ 
    public abstract void run(); 
} 
0

我認爲你需要閱讀更多的關於異步調用 - see here

這裏的問題是,當GWT獲取ArrayList的值時,代碼會繼續。在GWT與數據一起返回之前,您不能使用ArrayList的內容 - 否則,正如您發現的,將不會使用任何數據。

+0

好的!我理解它,但我希望在異步調用之後執行多行。我怎麼能這樣做?我可以用synchonize標記方法嗎? –

+0

@Jose如果您在執行代碼之前需要數據,則需要使用onSuccess方法調用它。斯坦因的例子很好。 – 2011-06-21 09:19:56

+0

對不起,我想說之後。我想獲得一組ArrayList,之後使用另一個方法打印來自ArrayList的數據的接口。 –