2010-04-06 14 views
5

Al usar mi aplicación Android, cuando un usuario realiza una determinada acción, se inicia un servicio en segundo plano que recupera la ubicación actual del GPS y la guarda en una base de datos, además de hacer otras cosas. En ese servicio, yo uso el requestLocationUpdates() de la clase LocationManager y esperar hasta que el onLocationChanged() de mi LocationListener (que es implementado por el servicio) se dispara. Pero, ¿cuál es la mejor manera de esperar a que se dispare el onLocationChanged? ¿Debería simplemente sondear una variable y esperar hasta que esté configurada? ¿Algun consejo?¿Cuál es la mejor manera de esperar una reparación de ubicación GPS?

Nota: No puedo simplemente escribir en la base de datos en el onLocationChanged() debido a algunas otras cosas.

EDITAR: Para borrar mi situación, puedo presentar un ejemplo similar a mi caso: Digamos que el usuario presiona un botón y se dispara un método myMethod que devolverá algún objeto. Entonces, en este myMethod me registraré para actualizaciones de ubicación desde el GPS (usando requestLocationChanged) y además espero la ubicación de los usuarios y la utilizo para algo. En otras palabras, myMethod no puede regresar antes de que la ubicación esté presente. No sé cómo puedo usar onLocationChanged en este caso.

Respuesta

3

Cuando se establece la ubicación, entonces onLocationChanged se dispara por lo que no es necesario para sondear cualquier variable. ¿Por qué no puedes guardar la ubicación en onLocationChanged?

+1

Probablemente porque el oyente GPS está en un segundo plano y no en su proceso principal. – Segfault

+0

Cuando el usuario realiza la acción que desencadena el servicio de búsqueda de ubicación, mi aplicación debe obtener la ubicación actual antes de que continúe. Digamos que el usuario presiona un botón y se activa un método myMethod que devolverá algún objeto.Luego, en este myMethod, me registraré para actualizaciones de ubicación desde el GPS (usando requestLocationChanged) y además esperaré la ubicación de los usuarios y la usaré para algo. En otras palabras, myMethod no puede regresar antes de que la ubicación esté presente. No sé cómo puedo usar onLocationChanged en este caso. – qtips

+1

¿Desea detener la ejecución en myMethod mientras espera que se sincronicen los gps y le proporcione una ubicación? No deberías hacer eso. Si eso es lo que necesita hacer, debe mostrar un cuadro de diálogo de progreso que se descartará cuando se active onLocationChanged. Y luego también en el final de LocationChanged todo lo que myMethod necesita hacer con la ubicación. –

0

Lo que hacer es establecer una visión de la pantalla principal para una barra de progreso de longitud indeterminada, establezca requestLocationUpdates() y acaba de regresar de nuevo al usuario. Si necesita bloquear al usuario hasta que se resuelva la ubicación, puede abrir un cuadro de diálogo sobre su actividad que no tenga controles y una vista de la barra de progreso. Luego, en su devolución de llamada onLocationChanged puede descartar ese diálogo y continuar con su negocio.

EDIT: He leído tu pregunta de nuevo y creo que lo entiendo mejor. Mi primera sugerencia sería ver si puedes acabar con tu servicio de fondo. No tiene que preocuparse de que la aplicación deje de responder mientras espera un bloqueo de GPS porque la API de GPS es asincrónica. Si no puede hacerlo por el motivo que sea, deberá mirar el mensaje que pasa API para permitir que su servicio en segundo plano envíe un mensaje a su Actividad principal cuando los datos del GPS estén disponibles. See the Developers guide.

0

Creo que deberías usar los métodos wait/notify. Deberías tener algún objeto de bloqueo. Llama a lockObject.wait() en tu método. Y llama a lockObject.notify() en onLocationChanged. De esta forma, su método no volverá hasta que se reciba onLocationChanged.

En realidad, la mejor solución sería la de revisar su diseño y hacer que su método asincrónico si es posible.

0

Según mi comprensión de la pregunta y leyendo los comentarios, le sugiero que tome la ubicación inicial usando getLastKnownLocation() de la clase LocationManager. Regístrese también para el evento onLocationChanged. Ahora puedes hacer las cosas que quieras en esta función del controlador de eventos mientras llevas adelante la parte delantera. Además, si necesita la ubicación actual, es posible que desee esperar requestLocationUpdates() para responder. Probablemente no sea una buena idea hacer que el usuario espere mientras su aplicación se prepara para alguna tarea. Según lo sugerido por otros, puede usar una barra de progreso aquí.

Cuestiones relacionadas