2010-05-02 8 views
5

¿Hay alguna manera de acelerar la población de una página con los elementos de la interfaz de usuario de GWT que se generan a partir de datos cargados desde el almacén de datos? ¿Puedo evitar hacer una llamada RPC innecesaria cuando la página está cargada?GWT: poblar una página del almacén de datos usando RPC es demasiado lento

Más detalles sobre el problema que estoy experimentando: Hay una página en la que genero una tabla con nombres y botones para una lista de entidades cargadas desde el almacén de datos. Hay una EntryPoint de la página y en su onModuleLoad() hago algo como esto:

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++; 
     } 
    } 
    ... 
}); 

Esto funciona, pero tarda más de 30 segundos en cargar la página con los botones de 300 candidatos. Esto es inaceptable.

La aplicación se ejecuta en Google App Engine y utiliza el almacén de datos del motor de la aplicación.

Respuesta

8

Podrías hacer muchas cosas, solo las enumeraré para que te den el mejor impacto.

  1. FlexTable no es para 300 filas. Dado que su tabla es tan simple, debería considerar generar el HTML a mano, y luego usar el widget HTML simple. Además, 300 filas es mucho de información: considere usar paginación. El DynaTable sample app le muestra cómo hacer esto.
  2. Parece que está utilizando un módulo GWT por página. Ese es el enfoque equivocado de GWT. Cargar un módulo GWT tiene un costo no trivial. Para entender lo que quiero decir, compare la actualización del navegador en gmail v/s el enlace de actualización que proporciona gmail. Ese es el mismo costo que paga cuando cada página de su sitio web tiene un módulo distinto de GWT.
  3. Si la lista de candidatos es necesaria para todas las vistas, puede enviarla junto con el HTML como un objeto JSON, y luego usar el Dictionary class en GWT para leerla. Esto le ahorra la llamada RPC que está realizando. Este enfoque solo se recomienda si los datos serán útiles en varias vistas/pantallas (como la información de los usuarios registrados)
  4. Compruebe cuánto tiempo está tomando su llamada al método RPC. Puede habilitar stats in GWT para averiguar dónde está tomando su tiempo la aplicación.
  5. También puede ejecutar Speed Tracer para identificar dónde está el cuello de botella. Esto es último solo porque es obvio que FlexTable está realizando muchas manipulaciones DOM. En general, si no sabes por dónde empezar, Speed ​​Tracer es una gran herramienta.
1

Lo importante aquí es cómo está recuperando la lista de candidatos, que no ha mostrado. 30 segundos es extremadamente alto, y es poco probable que solo se deba al almacén de datos.

¿Has probado usar appstats para perfilar tu aplicación?

1

Como sri suggested - paginación es más fácil y (creo) la mejor solución (junto con el cambio a Grid o simplemente <table>). Pero en caso de que desee por alguna razón mostrar/renderizar muchas filas a la vez, el GWT Incubator project tiene a nice wiki page al respecto, junto con algunos puntos de referencia que muestran cómo FlexTable apesta en el conteo de filas grandes. Consulte también su other tables;)

1

Su problema es que cada vez que agrega algo a la FlexTable tiene que volver a procesar toda la página y volver a pintar. Intente crear una nueva FlexTable, rellenándola, cuando esté completamente poblada, elimine la anterior y coloque la nueva allí.