1

CustomerActivityのクラスは、たまたま MVP の意味でプレゼンターでもあります。ユーザーによるアクションに応答して、次のコードが呼び出されます。

context.update(customer).fire(new Receiver<CustomerProxy>() {
  public void onSuccess(CustomerProxy response) {
    // set the view according to the response
  }
});

上記のコードが実行されると、次の 2 つのことが起こります。

  • ビューの状態を更新できる Customer の更新されたコピーを受け取ります

  • EntityProxyChange イベントが発生する

CustomerActivityは EntityProxyChange イベントをリッスンします。これは、他アクティビティも顧客レコードに変更を加えるためです。最新の状態を維持したいと考えていCustomerActivityます。

EntityProxyChange.registerForProxyType(eventBus, CustomerProxy.class,
  new EntityProxyChange.Handler<CustomerProxy>() {
    public void onProxyChange(EntityProxyChange<CustomerProxy> event) {
      fetchCustomer(event.getProxyId());
      // ...but what if it was me that made the change?
    }
  });

このupdateメソッドは既に最新の Customer を返しているため、EntityProxyChange. 回避できるのであれば、サーバーへの別の呼び出しのコストを負担したくありません。

EntityProxyChangeクラスがエンティティのバージョン番号を提供してくれることを期待していました。これは、キャッシュした顧客のバージョンと比較できます。サイコロはありません。

ある種のinTheMiddleOfAnUpdateOperationフラグを設定して、顧客を取得する前に確認できると思います。それは人々がしていることですか?その考えは私をほんの少しギャグにさせます. 変更をリッスンし、同じエンティティ タイプに変更を加えるアクティビティを作成するためのより良い方法を提案できますか?

4

1 に答える 1

1

これが機能するかどうかはわかりませんが、別のイベント バスを作成してみることができます。

final EventBus customerActivityEventBus = new SimpleEventBus();

この eventBus で新しい RequestFactory を初期化し、それを CustomerActivity で使用します。

customerActivityRequestFactory = GWT.create(CustomerRequestFactory.class);
customerActivityRequestFactory.initialize(customeActivityEventBus);
CustomerRequest context = customerActivityRequestFactory.customerRequest();

CustomerActivity は引き続きメインの eventBus からの変更イベントをリッスンしますが、発生したイベントは表示されません。他のアクティビティでは、必要に応じて、customerActivityEventBus からのみ、または両方からイベントをリッスンします。

もちろん、リクエスト ファクトリ以外のイベントに使用するメインの eventBus は 1 つだけにしておきます (つまり、ActivityManager、PlaceHistoryHandler など)。

于 2011-06-10T10:26:00.450 に答える