【问题标题】:GWT example MVP appGWT 示例 MVP 应用程序
【发布时间】:2013-01-17 09:59:42
【问题描述】:

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

【问题讨论】:

    标签: gwt mvp


    【解决方案1】:

    这完全取决于您的实施。

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

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

    因此,如果每个演示者/视图都是独立的,则可以使用单个视图/演示者。

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

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

    每当您加载视图并引发在相应演示者中捕获的事件时,该事件和所有计算都会发生与生成新演示者/视图一样多的次数。

    示例: -Presenter1/View1 已加载并捕获一些事件 -Presenter2/View2 已加载 -Presenter1(新实例)/View1(新实例)已加载并捕获一些事件。 - 事件通过全局事件总线引发 -Presenter1 捕捉事件 -Presenter1(新实例) 捕获事件

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

    希望这会有所帮助。

    【讨论】:

    • 听起来我应该保持原样。您是否认为在引发事件以更改页面时,事件对象本身应该包含页面中触发我有兴趣传递到下一页的事件的所有数据?
    • 实现客户端数据库(基本上是一个保存和缓存数据的类)将有助于在演示者和视图之间共享数据。 gwt.googleusercontent.com/samples/Showcase/… 有一个 ContactsDatabase 类的示例。
    【解决方案2】:

    不要使用单例...糟糕!

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

    看一下我从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 类字段,并在切换历史令牌时重用它们。

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2023-03-13
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多