2012-06-05 5 views
6

Tengo un servicio en segundo plano que realiza trabajos pesados ​​dentro de una transacción una vez al día. Si el usuario inicia la aplicación en este momento, quiero que se quede quieto hasta que termine (alrededor de 10 segundos más o menos). ¿Cuál es la mejor manera de hacer esto en todas las actividades? Compruebe si el servicio se está ejecutando en la función "onResume" de cada actividad. ¿Y cómo sabemos cuándo se hace? Transmisiones locales Estoy adivinando ...¿La mejor manera de congelar y la aplicación mientras la base de datos está haciendo un trabajo de fondo pesado?

¿Mejores prácticas a alguien?

ACTUALIZACIÓN: He logró detener "onResume" hasta que mi servicio se realiza. El problema es que el usuario acaba de ver una pantalla en blanco hasta entonces. Probé los diálogos de progreso y los diálogos regulares mientras onResume está en pausa. Pero todos se muestran solo cuando onResume regresa y eso frustra el propósito. En otras palabras, de diálogo de progreso no "show" inmediatamente después "show()" se llama :(

Respuesta

1

Las emisiones locales son buenas.

en tus actividades cuestionan el servicio si está ocupado o no, y mostrar un mensaje adecuado al usuario antes de terminar la actividad.

Una vez que finalice el servicio, envíelo para que se termine.

+0

Sí, ¡he decidido salir de la pantalla solo si el usuario inicia la aplicación cuando el servicio está ocupado! Desafortunadamente, un mensaje de "Brindis" no parece funcionar cuando he llamado a finish(): | –

2

me gustaría tener un 'estoy ocupada procesando' bandera en el PP.

Y la aplicación debería verificar el inicio y luego bloquear la aplicación de una manera agradable, y luego verificar cada x segundos para ver el estado de la bandera. Podría hacerlo durante el procesamiento normal, por lo que cada acción verifica esta bandera localmente y en el servidor antes de comenzar.

parece una forma sencilla de bloqueo. por lo que tendrá que tomar en cuenta la contención (ajuste de múltiples usuarios y unsettin g) posiblemente usando una disposición de tipo de semáforo.

+0

No he estudiado semáforos todavía, pero probé su sugerencia. Hice un "Thread.Sleep" en un bucle mientras que en el método "onResume", pero la pantalla se quedó en blanco y nunca desperté :) –

+0

que necesita para leer sobre cómo despertar un hilo de dormir –

+0

tengo que trabajar :) . El único problema es que mientras la función "onResume" está durmiendo, puedo obtener un brindis o un mensaje de diálogo o un cuadro de diálogo de progreso para que aparezcan, los que cobran vida después de onesar ... ¡bueno, se reanuda! –

0

use AsyncTask en su servicio para hacer un trabajo de base de datos pesado.

y use Preferencias compartidas para guardar un indicador para notificar a otras actividades que el trabajo está en progreso. Cuando la bandera es verdadera significa que el trabajo en progreso y cuando la bandera es falsa significa que se ha realizado el trabajo.

hacer algo como esto:

private class DatabaseWork extends AsyncTask<String, Integer, Long> { 


protected void onPreExecute() 
    { 
     //Set SharedPref flag = trueto notify other activities that work has been started. 
    } 
protected Long doInBackground(URL... urls) { 

     //Your database work 
    return false; 
} 

protected void onProgressUpdate(Integer... progress) { 
    //if you want to show progress to user 
} 

protected void onPostExecute(Long result) { 
    //after complete your work set SharedPref flag = false to notify other activities that work has been finished. 
} 

}

Ahora puede ver el valor del indicador en cada SharedPref actividades onCreate o onResume evento. Si lo encontraste verdadero, entonces puedes mostrar un diálogo de progreso para decirle al usuario que espere.

+0

Estoy ejecutando la tarea en un servicio, por lo que en "onResume", compruebo si se está ejecutando y si no, lo pongo a dormir durante unos segundos en un ciclo while. Lo único es que, mientras el subproceso de UI está inactivo, no puedo mostrar un diálogo o un mensaje de Toast. ¡Esos parecen aparecer DESPUÉS de que onResume ha completado qué clase de error pasa! –

+0

@Bhagwad - No duerma en 'onResume'. En su lugar, diseñe los métodos del ciclo de vida ('onCreate',' onResume', 'onPause', etc.) para que funcionen en uno de dos estados, en función de si el trabajo está terminado. –

+0

El problema es que si mi base de datos está bloqueada, entonces super.onResume arroja un error. Como tengo que llamarlo de cualquier manera, estoy jodido a menos que pueda retrasar la ejecución hasta que mi base de datos esté libre de bloqueo. –

0

La mejor manera que encontré fue la creación de una "actividad de carga" que siempre carga primero y envía al usuario fuera de la pantalla principal cuando era seguro hacerlo.

Cuestiones relacionadas