Personal tools
You are here: Home Development Documents gvSIG desktop 1.0 / 1.1 gvSIG Andami Servicios a los plugins Tareas en segundo plano
Andami facilita la creación de tareas en segundo plano, permitiendo además que estas tareas sean cancelables (interrumpibles). Si deseamos realizar un procesamiento prolongado, conviene lanzarlo en un hilo separado (proceso en segundo plano), para no bloquear la interfaz gráfica. Un típico ejemplo de tarea a lanzar en segundo plano sería la exportación de una capa a un fichero. Se presentará un diálogo al usuario con el progreso de la tarea, y un botón que permita la cancelación del proceso.

Para crear la tarea usaremos el método:

- **public static void cancelableBackgroundExecution IMonitorableTask task)**

Para crear cómodamente una tarea en segundo plano, existe la clase abstracta *AbstractMonitorableTask* que implementa *IMonitorableTask* y que podemos extender anónimamente para crear nuestra tarea:

.. code-block:: java

  PluginServices.cancelableBackgroundExecution(new AbstractMonitorableTask() {
    public void run() {
      for (int i=0; i<100001; i++) {
        System.out.println("hilo mundo "+i);
      }
    }
  });

Simplemente con esto, la parte que está dentro del método *run()* se ejecutará en un nuevo hilo.

Si queremos mostrar un diálogo de progreso y dar la posibilidad de cancelar la operación, podemos añadir algunas líneas:

.. code-block:: java

  PluginServices.cancelableBackgroundExecution(new AbstractMonitorableTask() {
    public void run() {
      setNote(PluginServices.getText(this, "Exportar_fichero"));
      setInitialStep(0);
      setFinalStep(100000);
      for (int i=0; i<100001; i++) {
        if (!isCanceled()){
          System.out.println("hilo mundo"+i);
          setCurrentStep(i);
        }
        else {
          return;
        }
      }
    }
  });

El diálogo desaparecerá automáticamente al llegar al *final step* (en este caso 100.000), y **no** desaparecerá hasta que llegue al *final step* aunque el nuevo hilo ya haya finalizado.

.. figure.. code-block:: java andami.img/background-task-progress-undet.png
   :alt: Diálogo asociado a una tarea en segundo plano con barra de progreso indeterminado
   :align: center

   Diálogo asociado a una tarea en segundo plano con barra de progreso indeterminado

Si tenemos alguna necesidad especial que AbstractMonitorableTask no cubre, existen varias opciones:

- Extender AbstractMonitorableTask de forma no anónima, reescribiendo los métodos que necesitemos y el constructor.

- Extender DefaultCancellableMonitorable en una nueva clase que a la vez implemente IMonitorableTask, reescribiendo los métodos que necesitemos y el constructor.

- Crearnos una clase totalmente nueva que simplemente implemente IMonitorableTask e incorpore toda la funcionalidad que necesitemos.

El siguiente diagrama muestra toda la jerarquía de clases implicada en la creación de tareas en segundo plano, para que veamos con más claridad el significado de extender de una u otra clase:

.. figure.. code-block:: java andami.img/class-diag-background-tasks.png
   :alt: Diagrama de clases implicadas en la creación de tareas en segundo plano
   :align: center

   Diagrama de clases implicadas en la creación de tareas en segundo plano

Al extender AbstractMonitorableTask de forma anónima y pedirle que muestre el diálogo de progreso, nos muestra un diálogo de progreso *indeterminado*, es decir, la barra no avanza desde el inicio hasta el fin, si no que oscila a izquierda y derecha continuamente hasta que acaba la tarea. Ahora vamos a mostrar un ejemplo en el que extenderemos AbstractMonitorableTask de forma no anónima a fin de mostrar una barra de progreso *determinada*:

.. code-block:: java

  public class BackgroundTask extends AbstractMonitorableTask {
    public BackgroundTask() {
      setDeterminatedProcess(true);
      setNote(PluginServices.getText(this, "Exportar_fichero"));
      setStatusMessage(PluginServices.getText(this, "Exportando..."));
      setInitialStep(0);
      setFinalStep(100000);
    }	
    public void run() {
      for (int i=0; i<100001; i++) {
        if (!isCanceled()){
          System.out.println("hilo hilero"+i);
          setCurrentStep(i);

        }
        else {
          return;
        }
      }
    }
  }

y haremos uso de ella de la siguiente forma:

.. code-block:: java

  PluginServices.cancelableBackgroundExecution(new BackgroundTask());


.. figure.. code-block:: java andami.img/background-task-progress-determined.png
   :alt: Diálogo asociado a una tarea en segundo plano con barra de progreso determinado
   :align: center

   Diálogo asociado a una tarea en segundo plano con barra de progreso determinado


View source document


Powered by Plone CMS, the Open Source Content Management System

This site conforms to the following standards: