2010-05-02 76 views
5

有没有一种方法可以使用从数据存储加载的数据生成的GWT UI元素来加速页面填充?我可以避免在页面加载时进行不必要的RPC调用吗?GWT:使用RPC从数据存储中填充页面太慢

有关我遇到的问题的更多详细信息:有一个页面可以生成一个表格,其中包含名称和按钮,用于从数据存储区加载的实体列表。有一个入口点的页面,并在其onModuleLoad()我做这样的事情:

final FlexTable table = new FlexTable(); 

rpcAsyncService.getAllCandidates(new AsyncCallback<List<Candidate>>() { 
    public void onSuccess(List<Candidate> candidates) { 
     int row = 0; 
     for (Candidate person : candidates) { 
      table.setText(row, 0, person.getName()); 
      table.setWidget(row, 1, new ToggleButton("Yes")); 
      table.setWidget(row, 2, new ToggleButton("No")); 
      row++; 
     } 
    } 
    ... 
}); 

这工作,但时间超过30秒300点的候选按钮加载页面。这是无法接受的。

该应用在Google App Engine上运行并使用应用引擎的数据存储。

回答

8

你可以做很多事情,我会列出它们以便给你带来最好的影响。

  1. FlexTable不适用于300行。由于您的表格如此简单,您应该考虑手动生成HTML,然后使用简单的HTML小部件。另外,300行是很多的信息 - 考虑使用分页。 DynaTable sample app告诉你如何做到这一点。
  2. 看起来您每页使用一个GWT模块。这是GWT的错误方法。加载GWT模块有一些不平凡的成本。要理解我的意思,请比较gmail提供的刷新链接上的浏览器刷新。当您的网站中的每个页面都有独特的GWT模块时,这与您付出的成本相同。
  3. 如果跨视图需要候选列表,则可以将它与HTML一起作为JSON对象发送,然后使用GWT中的Dictionary class来阅读它。这为您节省了您正在进行的RPC调用。只有在数据将在多个视图/屏幕(如登录的用户信息)中有用时,才建议使用此方法。
  4. 检查您的RPC方法调用所花费的时间。您可以启用stats in GWT来确定应用程序需要花费的时间。
  5. 您也可以运行Speed Tracer来确定瓶颈的位置。这仅仅是因为FlexTable显然执行了大量的DOM操作。一般来说,如果你不知道从哪里开始,Speed Tracer是一个很好的工具。
1

这里最重要的是你如何检索你没有显示的候选人名单。 30秒非常高,并且不太可能仅由于数据存储。

您是否尝试过使用appstats来分析您的应用程序?

1

sri suggested - 分页是最简单,(我认为)最好的解决方案(与切换到Grid或只是<table>一起)。但是,如果您因为某种原因需要一次显示/渲染多行,则GWT Incubator project有关于它的a nice wiki page - 以及一些基准测试,显示如何在大行数下吮吸FlexTable。看看他们的other tables太;)

1

你的问题是,每次你添加一些FlexTable它必须重新呈现整个页面和重画。尝试创建一个新的FlexTable,填充它,当它完全填充时,摆脱旧的,并把新的一个。