Pregunta

Aquí el escenario:

  1. Tengo 2 actividades y un servicio
  2. La primera actividad es una landing view/página de búsqueda.Segunda actividad muestra los resultados de la búsqueda
  3. La búsqueda se ejecuta siempre en contra de los internos db SQLite
  4. Periódicamente (dicen cada día) db necesita ser actualizado desde el origen remoto de que es un proceso largo
  5. Si el usuario realiza la búsqueda durante la actualización quiero esperar hasta que la actualización es más, mientras se muestra "por Favor espere" el progreso de alerta.No quiero para consulta y mostrar los resultados de búsqueda hasta que la actualización esté totalmente cocido.
  6. La actualización de db es provocada por AlarmManager y ejecutado por el servicio que pone "ACTUALIZACIÓN de estado" en db, mientras la actualización está en progreso
  7. Fácilmente se puede consultar el estado pero, ¿cómo puedo esperar y periódicamente re-consulta de la base de datos?Estoy usando AsyncTask para procesar los resultados de búsqueda y mi reacción instintiva fue poner un bucle con wait() en AsyncTask#doInBackground método pero es muy peligroso y simplemente no funciona ya que no estoy controlando el subproceso de interfaz de usuario, así que terminan con IllegalMonitorStateException.

Lo que sería un "derecho" de manera de espera (puede ser incluso con la actualización de estado) en este caso?

P. S.Me colocó la "espera" de código en un Ejecutable y ejecutarlo incluso antes de llegar a mi AsyncTask.Funciona por ejemplo Thread.sleep(2000) todavía no estoy seguro de que es la forma de hacerlo de manera segura.¿Alguien tiene alguna experiencia con FutureTask?

¿Fue útil?

Solución

  

Si el usuario realiza la búsqueda durante el   actualizar Quiero esperar hasta que la actualización   es más mientras se muestra "Por favor espere"   Alerta de progreso. No quiero para consultar   y mostrar resultados de búsqueda hasta   actualización está completamente hecho.

Esa es su decisión, pero hay que tener en cuenta que está creando su propio problema. En lo personal, me gustaría volcar este requisito. El usuario no debe ser molestados sólo porque una alarma se disparó.

Por ejemplo, se puede desactivar la alarma y volver a habilitarlo cuando la actividad se va.

O, se llevará a cabo la actualización de tal manera que es atómica (por ejemplo, hacer la actualización en una copia de la tabla, a continuación, sincronizar las tablas de una transacción), por lo que la actividad todavía se puede acceder con seguridad a la base de datos mientras se realiza la actualización.

  

¿Cuál sería una manera "correcta" de   adecuadamente esperar (puede ser incluso con el estado   update) en este caso?

Haga que el servicio de contar la actividad cuando la actualización se lleva a cabo, a través de algún tipo de devolución de llamada, o tal vez una Intención de difusión. Mantener el indicador de progreso con vida hasta que esto ocurra. Esto todavía presenta algunos problemas de tiempo, por lo que yo acababa de volcar el requisito.

Otros consejos

Gracias a la Marca (como siempre) de conocimientos útiles.Aquí, voy a esbozar cómo (en mi mente) el escenario anterior se debe hacer:

  1. En lugar de meter la base de datos simplemente enlazar con el servicio y empezar a la espera
  2. Si usted no puede enlazar a continuación, el servicio no se está ejecutando de manera que no hay necesidad de mono con ella - solo una consulta a la db y hacer lo que usted necesita
  3. Cuando el servicio es, iniciar la espera y el proceso de retroalimentación que el servicio envía de vuelta.Estos pueden ser provisional de las actualizaciones y, a continuación, indicador final que el servicio se hace
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top