GWT示例MVP应用程序

时间:2013-01-17 09:59:43

标签: gwt mvp

我一直在看这个教程 https://developers.google.com/web-toolkit/articles/mvp-architecture 我想知道的是,使用这种MVP风格,每当用户更改页面并创建Presenter的新实例时,它的效率如何。主持人如果是单身人士会更好吗?我的最终目标是使用PhoneGap部署应用程序,这样任何性能提升都会很有用。

3 个答案:

答案 0 :(得分:0)

这一切都取决于你的实施。

如果您希望将状态保存在视图中,则可以使用单例演示者/视图。

效率更高,因为您不需要重新启动视图,但如果另一个视图上的某些事务进行需要更改第一个视图的更改,则效率会降低。在这种情况下,您需要在第一个演示者捕获的第二个演示者中引发一个事件,并相应地修改视图。这使得应用程序的可预测性降低了一些。

因此,如果每个演示者/视图都是独立的,那么单个视图/演示者就可以了。

在任何其他情况下,我会使用新的演示者/视图来重新初始化视图使用的表单中的数据。

请记住,使用应用程序范围的变量(例如事件总线)的每个新演示者都不会被销毁(垃圾收集),这会导致以下问题:

无论何时加载View并引发相应演示者捕获的事件,事件和所有计算都将在生成新的演示者/视图时多次发生。

实施例: -Presenter1 / View1已加载并捕获一些事件 -Presenter2 / View2已加载 -Presenter1(新实例)/ View1(新实例)已加载并捕获一些事件。 -Event通过全局事件总线引发 -Presenter1抓住了这个事件 -Presenter1(新实例)捕获事件

因此,从本质上讲(这不是一个规则)新的演示者为GWT应用程序提供了一个具有完全回发感的网页,而在另一种情况下,您感觉桌面应用程序会加载已存在的表单。

希望这有帮助。

答案 1 :(得分:0)

不要使用单身人士......哎呀!

如果您懒洋洋地初始化演示者并保存其引用以供重复使用,则不必每次都创建新实例。

查看我从https://developers.google.com/web-toolkit/articles/mvp-architecture-2#code_splitting获取并修改的以下示例,以突出显示如何重用演示者,类似于重用视图的方式。

 public void onValueChange(ValueChangeEvent<String> event) {
    String token = event.getValue();

    if (token != null) {
      if (token.equals("list")) {
        GWT.runAsync(new RunAsyncCallback() {
          ...
          public void onSuccess() {
            // lazily initialize our views and presenters, and keep them around to be reused
            if (contactsView == null) {
              contactsView = new ContactsViewImpl<ContactDetails>();
            }
            if (contactsPresenter == null) {
              contactsPresenter = new ContactsPresenter(rpcService, eventBus, contactsView);
            }
            contactsPresenter.go(container);
          }
        });
      }
      ...
   }

除了通过RunAsyncCallback进行代码拆分的性能优势之外,基本上,您将每个Presenter的引用保持为AppController类字段,并在切换历史记录时重用它们。

答案 2 :(得分:0)

我建议您使用gwt-platform。我在几个项目中使用它,从未遇到任何性能问题。它非常强大,可以帮助您构建应用程序,以便在将来更轻松地扩展它,同时保持良好的性能。