[Gvsig_desarrolladores] gvSIG Movile - carga de imagenes en hilos

Ignacio Gámez Ramírez ignacio.gamez en geograma.com
Jue Jul 23 09:41:14 CEST 2009


Buenas,

Estoy haciendo algunas pruebas para cambiar la forma de renderizar las imágenes y tengo un problema con el que llevo varios días sin conseguir detectar cual es el error.
Os comento: En el MapControl se tiene el método "public boolean draw(boolean doClear)" que se encarga de renderizar las distintas capas a través de otro método de la clase MapContext. La forma de renderizar las capas es secuencial de forma que hasta que no se completa la carga de todas las capas no se muestra la imagen final. Yo estoy intentando que la renderización de capas se haga de forma independiente para que a medida que se carga una capa se muestre en el visor. Para ello he creado una clase "Render" que se encarga de lanzar la renderización de cada capa en un hilo (Thread) independiente y a medida que terminan de pintarse se le muestra al usuario (con orden).
A esta clase "render" le paso el gráfico del MapControl para pintar las capas en este. 
Os adjunto la clase Render para que os hagáis una idea (es una clase muy simple). Para dar transparencia a la imagen base he hecho una chapuza que es cargar una imagen transparente al cargar la aplicación para no perder tiempo en cargar la imagen cada vez que se utiliza (pero sin más, eso no preocupa ahora).

El problema que tengo es que en PC funciona correctamente (a medida que se pintan las imágenes se les va mostrando al usuario) pero en móvil se cierra inesperadamente la máquina virtual y después de revisar el código (que es muy simple) no consigo entender por qué puede ser. Me imagino que tiene que estar relacionado con pintar en el gráfico del MapControl de forma "aleatoria" o mejor dicho "no de forma secuencial". 

Me interesa mucho resolver esto porque creo que mejora la visualización de los mapas ya que cuando hay varias capas se evita que el usuario tenga que esperar mucho para ver resultados.

EL método de la clase MapControl sería algo así:

public boolean draw(boolean doClear) 
{
	boolean do_something = (project.getMapContext().getLayerCount() > 0);

	if (true) {	clearCanvas();}
	if (do_something) 
	{
		setProcessing(true);
		//project.getMapContext().draw(mapGraphics, canc);
		draw(mapGraphics, canc);
	}
	return do_something;
}

public void draw(Graphics2D g,Cancellable canc)
{
	ViewPort viewPort = getViewPort(); 
	if (viewPort.getAdjustedExtent() == null) {return;}

	// IMPORTANTE: EL NUEVO RENDER
	Render render = new Render(g,viewPort,this);
      FLayer[] vls = getVisibleLayers();
      render.draw(vls, canc);
        
      System.gc();
}

public void setProcessing(boolean isSplashVisible, boolean notRedraw, Graphics2D g)
{
	processingSplash.setVisible(isSplashVisible);
	dontRedraw=notRedraw;
}

Siento enviaros toda esta chapa pero igual a alguien le interesa el tema ya que creo que mejora la visualización de mapas.

Un saludo.


------------ próxima parte ------------
Se ha borrado un mensaje que no está en formato texto plano...
Nombre     : Render.java
Tipo       : application/octet-stream
Tamaño     : 7150 bytes
Descripción: Render.java
Url        : http://listserv.gva.es/pipermail/gvsig_desarrolladores/attachments/20090723/91823b50/attachment.obj 


More information about the gvSIG_desarrolladores mailing list