2011-06-21 17 views
1

問題があります。私はGWTのサーバー側に電話しています。 呼び出しの結果はArrayList(result)です。 onSuccessメソッド内で別の ArrayListが結果でラップされます。しかし、 ArrayListリストをonSuccessメソッドの外側に使用したい場合は、 の0要素が含まれていますが、その内部はresult ArrayListのようです。どうすれば解決できますか?私は クラス属性、静的属性としてlistaを使用しようとしました...しかし、 が実行されません。AsynCallBackの問題 - GWT

まあ、コードを変更しましたが、実行されません。 see here - する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を参照するfinal変数またはメンバ変数を作成して、コールバックが呼び出すことができるasynchCallを実行しているクラスでは、大量のインデントを避けて、定義する必要がある最終的な量を減らすのに役立ちますメソッドを呼び出して応答を処理します。

擬似コードのサンプル(非常に単純化された):呼び出し後のコードの多くについて

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.. 
    } 
} 

EDIT

コールバックした後、「もの」の多くを行うために必要がある場合は、単にonSuccessやonSuccessコールで行うメソッド(サンプルなど)に入れてください。

複数のコールバックを順番に実行する必要がある場合(エラーが発生するとエラーが発生する)、まず複数のアクションを組み合わせたサービスメソッドを作成するか(onSuccess内で別のサーバーコールを行う必要があります)折り返し電話。これを単純化するために、ネストされたコードを避けるために、カスタムコールバックインターフェイスを使用して、次のサーバーコールを呼び出す最初のコールバックで使用する匿名クラスを定義することができます。

私は、多くの場合、このインタフェース(またはそのバリエーション)を使用してコールバックした後に行うことに何かを定義するには、このインターフェイスを使用します。

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

...別のメソッドを呼び出します。

ここでの問題は、GWTがArrayListの値をフェッチしている間にコードが継続することです。 GWTがデータと共に返されるまで、ArrayListの内容を使用することはできません。そうでなければ、あなたが発見したように、使用するデータはありません。

+0

私はそれを理解していますが、非同期呼び出しの後にserveral行を実行したいと思います。どうすればいい?シンクロナイゼーションでメソッドにタグを付けることができますか? –

+0

@Joseコードを実行する前にデータが必要な場合は、onSuccessメソッドから呼び出す必要があります。スタインの例は良いです。 –

+0

申し訳ありませんが、私は後で言いたいことがあります。私はArrayListのセットを取得したいと思いますし、別のメソッドを使って、ArrayListからのデータでインターフェイスを印刷します。 –