2010-05-02 34 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,填充它,當它完全填充時,擺脫舊的,並把新的一個。

相關問題