2010-01-14 36 views
6

Parece haber un par de formas de realizar una tarea en segundo plano. Mi uso es que mi aplicación busque un archivo de datos cada x minutos, independientemente de si mi GUI se está ejecutando, y si el teléfono está durmiendo o no.Cómo programar una tarea en segundo plano

Uso un alarmmanager para programar una intención que coincida con un receptor de difusión. en el método onRecieve, comienzo un servicio (startService), que genera una AsyncTask. La tarea recupera datos, los almacena y luego detiene el servicio.

en el método onRecieve Adquirí un PARTIAL_WAKE_LOCK, antes de comenzar el servicio, y justo antes de llamar a stopSelf() en el servicio, lo lanzo nuevamente.

¿Es esta la mejor manera de hacerlo? ¿Incluso necesito el servicio en este escenario?

Experimento un comportamiento extraño con esta configuración, donde la configuración funciona durante horas y luego se detiene de repente, lo que hace que sea muy difícil de depurar.

¿Alguien tiene un método simple infalible para lograr el mismo fin?

Respuesta

5

Uso un alarmmanager para programar un intento de que coincida con un receptor de difusión. en el método onRecieve, comienzo un servicio (startService), que genera una AsyncTask. La tarea recupera los datos y los almacena y luego detiene el servicio .

me gustaría sugerir el uso de un IntentService en lugar del patrón AsyncTask/stopSelf(), pero por lo demás parece sonido.

en el método onRecieve i adquirir un PARTIAL_WAKE_LOCK , antes de iniciar el servicio , y justo antes de llamar stopSelf() en el servicio, libero nuevo.

Eso tiene sentido. Hago más o menos lo mismo en mi WakefulIntentService componente de código abierto.

¿Es esta la mejor manera de hacerlo?

Ciertamente pareces cercano.

¿Necesito el servicio incluso en este escenario ?

Si lo que necesita hacer de manera programada está garantizado para tomar solo un segundo más o menos, puede hacerlo en el BroadcastReceiver. De lo contrario, debe hacer que el trabajo se realice en una cadena de fondo, y BroadcastReceivers no puede tejer hilos de fondo.

+0

aha! entonces, ¿no podría comenzar mi asynctask en el emisor? incluso si obtengo el wakelock en onrecieve y lo lanzo cuando termina la asynctask? gracias por la información, y supongo que tendré que burlarme un poco más por mi alarma extraña para – Wilken

+0

"¿así que no podría comenzar mi asynctask en el emisor?" No lo creo, pero no lo he intentado.AsyncTask tiene su propio grupo de subprocesos, y es * posible * que puede ejecutar con seguridad una AsyncTask desde un BroadcastReceiver. – CommonsWare

+0

Gracias por la idea de usar IntentService, no lo sabía. Ahora he eliminado mi servicio y AsyncTask. Mucho más elegante. – Wilken

Cuestiones relacionadas