1

アクティビティ/場所と MVP を使用した最初の独自の例を完成させました。すべて正常に動作しますが、(別の場所から) 場所に戻ると、一部のイベントが適切に送受信されません。しかし、この場所がデフォルトの場所として設定されている「moduleLoad」では、すべて正常に動作します。場所/アクティビティが moduleLoad で開始された場合 (historyHandler = new PlaceHistoryHandler(historyMapper); historyHandler.register(placeController, eB, defaultPlace); historyHandler.handleCurrentHistory();) または placeController を介して開始されても、違いはないと思います。 goTo(場所); 、そうすべきですか?

デバッグを介して、イベント登録、イベント送信、イベント受信の順序を確認しました(すべてアクティビティの開始(...)で実行されます)。問題は、 start() が goTo(place) を介して実行された場合、すべてのレシーバーがイベントを受信しないことです (登録と送信は正常に機能します)。しかし、イベントが start() の後または start() 内で送信され、moduleLoad で実行された場合は、すべて正常に動作します。

私の活動の開始は次のようになります。

@Override
public final void start(final AcceptsOneWidget panel, final EventBus eventBus) {
// register events - to manipulate visibility of some display areas
eventBus.addHandler(SelectedEvent.TYPE, this);
//initiate presenters -(pseudo code)
[presenter that receives SelectedEvent]
[presenter that sends SelectedEvent]
//ading presenter's asWidgets to screen -> panel.setWidget..
...
}

@Override
public final void onSelected(final SelectedEvent event) {
   //do something
}

(開始時にこのイベントを送信するユースケースは、何も選択されていないと言いたい - イベントのペイロードが null である)

問題は、goTo 経由で start() が呼び出された場合、プレゼンターの onSelected メソッドもアクティビティの onSelected メソッドも呼び出されないことです。ただし、すべての場合 (デバッガーで確認) で、イベントの登録は送信前に発生します。私は何をすべきか?

4

1 に答える 1

2

Javascriptはマルチスレッドではありません。

goTo()メソッドを呼び出すと、アクティビティが次々に開始されます。start()内でイベントを発生させると、残りのアクティビティが開始される前にイベントがディスパッチされます。そのため、そのイベントを処理するアクティビティがまだ開始されていない(登録が行われていない)可能性があります。

次のコードで問題を解決できます。

Scheduler.get().scheduleDeferred(new ScheduledCommand()
{
    @Override
    public void execute()
    {
        //Fire the event
    }
});

スケジューラは、GWTによって提供されるユーティリティクラスです。ScheduleDeferredは、現在のブラウザイベントループが戻った後にコマンドを実行します。

したがって、このコードをstart()に貼り付けることで、すべてのアクティビティが開始されるとすぐにイベントが発生することがわかります。

于 2011-06-21T09:04:55.617 に答える