1

こんにちは、私はそのような機能を持っています:

    @Override
    public boolean checkExist(String name) {

        final boolean check[] = new boolean[] { false };

        getAllRecordFromServer(new SearchCallback() {

            @Override
            public void onSearchResult(Map<String, Item> itemsMap) {
            //do some action set true when map key equals name  
                 check[0] = true;
            }

            @Override
            public void onSearchError(XMLPacket error) {
                // TODO Auto-generated method stub

            }
        });

        return check[0];
    }

私は解決策を探していて、いくつかの記事を見つけましたが、gwt でそれを行う方法がわかりません :/ このコードは正しく動作しません ... これは非同期コールバックです。

この問題を解決するにはどうすればよいですか?コールバックの終了後に値を返す必要があります。

4

3 に答える 3

6

行ったように、メソッドで非同期呼び出しから値を返すことはできません。それが「非同期」呼び出しの基本的な性質です。いつ戻るかわからない(ネットワーク/サーバーの遅延)ため、コードの実行は待機しません!!!!!

メソッドからブール値を返さないでください。代わりに、メソッドがコールバックを取るようにします。

 interface MyCallback {
   execute(boolean successfl);
 }

 public void checkExist(String name, MyCallback callback) {
       getAllRecordFromServer(new SearchCallback() {
            @Override
            public void onSearchResult(Map<String, Item> itemsMap) {
            //do some action set true when map key equals name  
                 callback.execute(true);
            }

            @Override
            public void onSearchError(XMLPacket error) {
            }
        });
 }
于 2013-03-30T15:31:25.747 に答える
1
This code is not working properly ...

その理由は、あなたのコードが入っていてsynchronous model、あなたが作っているからですAsynchronous calls

で何らかの結果を得た後、何かをしていると思いますonSearchResult

したがって、サーバーから応答を受け取るまでコードの実行を停止します。呼び出しがいつか失敗する可能性があることを知らないからです。

値をグローバルに使用したい場合は、

public boolean returnVal=false;

public void checkExist(String name, MyCallback callback) {
       getAllRecordFromServer(new SearchCallback() {
            @Override
            public void onSearchResult(Map<String, Item> itemsMap) {
                  returnVal=true;
                  proceedFurther(itemsMap) //your next lines of code in this method.
            }

            @Override
            public void onSearchError(XMLPacket error) {
             stopProceedFurther(); //show  some error message to user.
            }
        });
于 2013-03-30T19:36:55.800 に答える