0

データを取得するために別のクラスのサービス(「DataClass」)を必要とするアクティビティがあります。このデータクラスは、データをフェッチするために呼び出すことができ、成功するとイベントを発生させます。アクティビティで初めてデータが必要になるのは「開始」です。現在の場所によってもたらされた状態を解決し、それに応じてビューを更新します。

問題は、アクティビティonDataEventメソッドが最初に呼び出されるのではなく、後続のすべてのイベントで呼び出されることです。イベントのハンドラーを確認しました。最初のイベントが発生すると、アクティビティはこのイベントに登録されます。イベントをコンストラクターに登録しようとしましたが、何も変わりません。では、イベントのアクティビティを登録し、startメソッド内でトリガーしてそれに反応する方法は?または、そのようなユースケースを一般的に実装する方法。

その間に編集して、私はここの ようにそれを実装しようとしましたが、成功しませんでした。

startメソッドのコードは次のとおりです。

    @Override
public final void start(final AcceptsOneWidget panel, final com.google.gwt.event.shared.EventBus eventBus) {
    this.eb = new ResettableEventBus(eventBus);
    if (!(pc.getWhere() instanceof DynamicTablePlace)) {
        throw new IllegalStateException(CreateDynamicTableActivity.class.getName() + " should only be called on "
                                        + DynamicTablePlace.class.getName());
    }
    view.setPresenter(this);
    this.eb.addHandler(DynamicTableHashResolvedEvent.TYPE, this);
    stateResolver.resolveState(((DynamicTablePlace) pc.getWhere()).getTablehash(), eb); //this is triggering the event
    panel.setWidget(view);
}

onDynamicTableHashResolved(DynamicTableHashResolvedEvent event)メソッドは、最初に呼び出されるのではなく、後続のすべてのイベントで呼び出されます。

4

1 に答える 1

0

グーグルグループでは、誰かが私に問題を指摘しました。私はすでにこの種の問題に遭遇しました。問題は、ブラウザがいくつかのイベントを処理し(アクティビティ開始メソッドが場所変更イベントで呼び出される)、このプロセス内で別のイベントを登録し、登録されたばかりのイベントをトリガーした場合、それは機能しません-登録は「完了」していませんこの瞬間。解決策は簡単です。コードでイベント「deferred」をトリガーします。

        Scheduler.get().scheduleFinally(new ScheduledCommand() {
        @Override
        public void execute() {
            stateResolver.resolveState(((DynamicTablePlace) pc.getWhere()).getTablehash(), eb);

        }
    });

問題は次のとおりです。これは、このアクティビティのテスト能力(gwtテストケースなし)を壊します。

Thomas Broyerから:スケジューラーが注入された場合、通常はテストでき、テストで使用するためにStubSchedulerが提供されています。私の場合、コマンドを実行するだけのスケジューラーのモックを作成しました。私の場合は、scheduleFinally(ScheduledCommand cmd)のみを実装する必要があります。

于 2012-04-25T07:07:12.967 に答える