質問ばかりで恐縮です・・・。
GWTのRCPは非同期に行われますが、同期化することは可能でしょうか?
サーバに1回目の問い合わせを行い、その返答を待ち、その返答の
内容を使用して次の処理を行うような場合ですが、GWTのRCPでは、
AsyncCallbackのOnSuccessメソッドの中でしかサーバからの返答を
待って次を処理するような一連の処理を記述することができず、
OnSuccessメソッドがどんどん肥大化して困っています。
皆様はこのような場合、どのように書いているのでしょうか?
ご教示いただければ幸いです。
よろしくお願いいたします。
hge
自分の場合はAsyncCallbackのインスタンスを
private finalとしてクラスのフィールドとして持たせ、
RPCメソッド呼び出し時には、
このフィールドを引数として渡すようにしています。
またonSuccessメソッドの内容を別のメソッドに移し、
onSuccessからはそのメソッドを呼び出すようにして、
(見た目上)onSuccessの中が大きくならないようにもしています。
これらにより自動フォーマットした際のタブの数が若干少なくなり
見通しが利くようになるかと思います。
非常に細かい部分ですが参考になりますでしょうか?
>>GWTのRCPは非同期に行われますが、同期化することは可能でしょうか?
RPCでしたね。お恥ずかしい。
> またonSuccessメソッドの内容を別のメソッドに移し、
> onSuccessからはそのメソッドを呼び出すようにして、
> (見た目上)onSuccessの中が大きくならないようにもしています。
> これらにより自動フォーマットした際のタブの数が若干少なくなり
> 見通しが利くようになるかと思います。
なるほど、やはり、同期化を実現するには、本質的にonSuccessが
肥大化するのはしょうがないのですね・・。
これは理解できました。
しかし、
> 自分の場合はAsyncCallbackのインスタンスを
> private finalとしてクラスのフィールドとして持たせ、
> RPCメソッド呼び出し時には、
> このフィールドを引数として渡すようにしています。
これは、非同期のRPCを同期化するという意味で、何か効果が
あるのでしょうか?呼び出す度にAsyncCallbackオブジェクトを
生成するのと何が違うのでしょうか?
何度も申し訳ありませんがよろしくお願いします。
> これは、非同期のRPCを同期化するという意味で、何か効果が
> あるのでしょうか?呼び出す度にAsyncCallbackオブジェクトを
> 生成するのと何が違うのでしょうか?
本質的な違いは全くありません。動作結果は全く同じです。
ただ、ソースを見たときにタブの数が減っていたほうが
見やすいかなと思い、上記のような書き方をいたしました。
(eclipseでフォーマットをかけると、スコープの関係上(?)2つ分くらいタブが減ります)
また、インスタンスの数が減るのでメモリの利用効率が
良くなる(といいなぁ...)という効果が期待できます。
(IEとFirefoxのJavaScriptのインタプリタの仕様を知らないため想像で書いています。
詳しい方がいらっしゃいましたら補足を頂けると助かります。)
サーバからの応答を使って次の処理を実行するようにシーケンシャル
に処理を実装したいが、onSuccessが肥大化して困ると言うことでし
たら、こういう風にAsyncCallbackのインスタンスからそのインスタンス
を囲っているクラスのメソッドを呼び出す方法はいかがでしょうか?
==== sample ====
public class MyApp implements EntryPoint {
// 省略
public void onModuleLoad() {
button.addClickListener(new ClickListener() {
public void onClick(Widget sender) {
if (label.getText().equals("")) {
procedure01();
} else {
label.setText("");
}
}
});
// 省略
}
private void procedure01() {
AsyncCallback callback = new AsyncCallback() {
public void onFailure(Throwable caught) {
Window.alert(caught.getMessage());
}
public void onSuccess(Object result) {
// エンクロージングクラスを参照する
procedure02((String) result);
// こちらの方法もあり
//MyApp.this.procedure02((String) result);
}
};
// proxyはServiceAsyncのインスタンス
proxy.greeting(getText(), callback);
}
private void procedure02(String message) {
label.setText(message);
}
}
以上、よろしくお願いいたします。
07/09/25 に hgengwt<hge...@gmail.com> さんは書きました:
追加の質問までしてしまって、お手数をかけてしました。
これでRPCのあたりはすっきりしました!
ありがとうございました!
JavaでGUIを作るのが初めてなので、いろいろと不慣れで・・。
ご提示していただいた方法も取り入れてみました!
だんだんとソースがすっきりしてきました。
ありがとうございました。助かりました。
> 07/09/25 に hgengwt<hgen...@gmail.com> さんは書きました: