Patrón de diseño para un servicio como la arquitectura
Qué patrón de diseño sería inteligente en el que los siguientes componentes (simplificado) existen:
3 Componentes
GUI
– Buscador de datos
– Base de datos
- Menú contextual similar a la nueva aplicación Play Music (v5.0.0)
- Patrón de Android para las preferencias / ajustes
- ¿Cómo cambiar el comportamiento del método mediante la reflexión?
- ¿La implementación vacía de métodos abstractos es un buen enfoque?
- Android: Actividad individual, vistas múltiples
No tengo acceso al servidor en Internet, es sólo un Data-Source. Los datos que se establecen en Internet son siempre los más nuevos, la base de datos local es sólo una copia (caché) de la de Internet. La interfaz gráfica de usuario puede solicitar y actualizar la caché local, el Service-like-component recupera de forma asincrónica los datos más recientes, lo que puede tardar un tiempo. La GUI sólo muestra datos de la base de datos local, que puede buscar de forma síncrona.
Así que mi pregunta es, ¿qué clases usarías para el servicio que ejecutaría a largo plazo con capacidades Progressbar? ¿Hay mejores diseños para este tipo de "problema"? ¿Existen mejores prácticas?
- ¿Alternativa al patrón observable?
- Android - index para ListView?
- ¿Cuál es el papel de la clase Activity en MVC?
- ¿Qué patrones de diseño se utilizan en Android?
- Cómo dejar actualizar la interfaz de usuario de Asynctask de diferentes maneras
- Android: sobreescribir onPause y onResume - forma correcta
- ¿Cómo implementar un singleton configurable?
- Un patrón de diseño para evitar múltiples ifs
En el componente de servicio similar:
- Una interfaz (método) para iniciar 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
jobId
determinado. La implementación de este servicio podría devolver un estado, percentCompleted o cualquier otra información relevante que le dirá al llamador el estado actual del proceso de actualización. La implementación de este método debe ser capaz de reportar un progreso incremental (por ejemplo, reportar el almacén incremental en el almacenamiento local) para hacer una barra de progreso precisa, de lo contrario la mejor interfaz de usuario podría mostrar la barra de progreso giratoria.- Tenga en cuenta que si no es posible implementar dicho informe incremental, el proceso de actualización probablemente debería usar un uso
AsyncTask
típico que ejecute la actualización en segundo plano e informe al usuario cuando haya terminado. Si esta operación puede tardar un tiempo, puede implementar la finalización de la actualización a través de la barra de notificaciones de Android o la notificación push.
- Tenga en cuenta que si no es posible implementar dicho informe incremental, el proceso de actualización probablemente debería usar un uso
Suponiendo que tiene la interfaz para obtener el progreso de la actualización, puede utilizar el AsyncTask onProgressUpdate para informar sobre el progreso de la actualización. El método está específicamente diseñado para ello.
Sus pasos son más o menos como sigue:
- Ejecute la interfaz para actualizar a través de un AsyncTask. Dado que su actualización se está realizando de forma asíncrona, esta tarea en particular debe volver bastante rápidamente con un informe de estado si la ejecución se ejecuta correctamente o falla debido a alguna excepción junto con el jobId que se está ejecutando actualmente
- Inicie otro AsyncTask que está haciendo ping al estado de la actualización e informe del progreso a través de
onProgressUpdate
. AsyncTask parece más o menos como
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; } }
- Cómo imprimir una imagen con el tamaño de papel completo (80MM) en la impresora térmica (EPSON)
- Cómo evaluar expresiones de usuario en un entorno limitado