2011-09-20 23 views
6

lo que el diseño-patrón sería inteligente en el que los componentes siguientes (simplificado) existe:patrón de diseño para un servicio como Arquitectura

3 Componentes
- GUI
- la función de obtención de datos
- Base de datos

Design

No tengo acceso al servidor en Internet, es solo un origen de datos. Los datos que se encuentran en Internet siempre son los más nuevos, la base de datos local es solo una copia (caché) de la que está en Internet. La GUI puede solicitar y actualizar la memoria caché local, el componente de tipo servicio obtiene, de forma asíncrona, los datos más recientes, lo que podría llevar un tiempo. La GUI muestra solo datos de la base de datos local, que puede recuperar de forma síncrona.

Así que mi pregunta es, ¿qué clases usarías para el servicio tal vez a largo plazo con las capacidades de Progressbar? ¿Hay mejores diseños para este tipo de "problema"? ¿Hay mejores prácticas?

Respuesta

1

En el Servicio Como Componente:

  • Una interfaz (método) para poner en marcha el proceso de actualización. Normalmente, este servicio devolverá un jobId para indicar un trabajo que se está procesando en segundo plano
  • Otra interfaz (método) para obtener el estado basado en un determinado jobId. La implementación de este servicio podría devolver un estado, porcentaje completado o cualquier otra información relevante que le dirá a la persona que llama el estado actual del proceso de actualización. La implementación de este método debe poder informar un progreso incremental (como informar el almacenamiento incremental en el almacenamiento local) para hacer una barra de progreso precisa; de lo contrario, lo mejor que la IU podría hacer es mostrar la barra de progreso giratoria.
    • Tenga en cuenta que si tal informe incremental no es posible implementar, entonces el proceso de actualización probablemente debería usar un uso típico de AsyncTask que ejecute la actualización en segundo plano e informe al usuario cuando haya finalizado. Si esta operación puede demorar un tiempo, puede implementar la finalización de la actualización mediante la barra de notificación de Android o la notificación de inserción.

Asumiendo que tiene la interfaz para obtener el progreso de la actualización, se puede utilizar la AsyncTask onProgressUpdate reportar el progreso de la actualización. El método está específicamente diseñado para eso.

Sus pasos son más o menos de la siguiente manera:

  • Ejecutar la interfaz para actualizar a través de uno AsyncTask. Dado que la actualización se realiza de forma asíncrona, esta tarea en particular debe regresar bastante rápidamente con un estado que informe si la ejecución se ejecuta correctamente o falla debido a alguna excepción junto con el identificador de trabajo que está ejecutando actualmente
  • Ejecute otra AsyncTask que está haciendo ping al estado de la actualización e informe el progreso a través del onProgressUpdate. El AsyncTask se ve más o menos así

public class GetUpdateStatusAsyncTask extends AsyncTask { 
    protected Integer doInBackground(Integer... param) { 
     // this is the jobId that you get from the previous AsyncTask that you use to kick off the 
     // the update process 
     int jobId = param[0]; 
     double percentCompleted = fetchStatus(jobId); 

     while(percentCompleted != 100.00) { 
      publishProgress(percentCompleted); 
     } 

     // return status code 
     return 1; 
    } 

    protected void onProgressUpdate(Double... progress) { 
     // set the progressBar here 
    } 

    protected void onPostExecute(Long result) { 
     // done, handle status code 
    } 

    private double fetchStatus(int jobId) { 
     double percentCompleted = 0.0; 
     // call interface to get the update based on the jobId 
     // return percentCompleted status or make a more complex object if you need 
     // more detail info 
     return percentCompleted; 
    } 
} 
+0

Tal vez debería aclarar mi primer post más. No he tenido acceso al Servidor en Internet.Es solo un origen de datos, el más nuevo. Agarro los datos y actualizo la base de datos local. – kadir

+0

Si el componente como servicio es una clase local, para informar el progreso con precisión, aún existe la necesidad de que la interfaz pueda obtener el progreso actual dentro de esta clase. Sin la disponibilidad de esa interfaz, lo mejor que puede hacer es mostrar la barra de progreso giratoria y esperar hasta que la actualización finalice. Voy a actualizar la respuesta – momo

+0

se ve bien, pero ¿por qué quieres iniciar otra asynctask para sondear el progreso de la primera? – kadir

Cuestiones relacionadas