GWT:使用RPC从数据存储区填充页面太慢

Ily*_*din 5 java gwt google-app-engine gwt-rpc

有没有办法通过从数据存储区加载的数据生成的GWT UI元素来加速页面的填充?加载页面时,我可以避免进行不必要的RPC调用吗?

有关我遇到的问题的更多详细信息:有一个页面,我在其中生成一个表,其中包含从数据存储区加载的实体列表的名称和按钮.页面有一个EntryPoint,在它的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++;
       }
    }
    ...
});
Run Code Online (Sandbox Code Playgroud)

这可以工作,但是需要超过30秒来加载具有300个候选按钮的页面.这是无法接受的.

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

Sri*_*nan 8

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

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