Bajo el cap贸 de un JobIntentService

En este art铆culo, hablaremos sobre un problema con JobIntentService, sobre el cual hay muchas preguntas sobre los recursos e informes correspondientes en el rastreador de errores de Google. Y tambi茅n sobre la raz贸n por la cual, a juzgar por todo, Google no lo considera un error y cierra estos informes.


Introduccion


JobIntentServices se crearon para el trabajo en segundo plano. Fueron ampliamente utilizados en Android 8 y superior, cuando desapareci贸 la capacidad de usar servicios en segundo plano.
De hecho, reemplazan los servicios en segundo plano y tambi茅n est谩n bajo el control del planificador de tareas (JobScheduler).


Por lo tanto, el sistema tiene la capacidad de controlar el progreso de las tareas en segundo plano y tambi茅n controla los wakelocks en s铆, lo que permiti贸 optimizar el consumo de bater铆a del dispositivo y evitar que los desarrolladores usen wakelocks de forma incorrecta. Estos pasos han minimizado la situaci贸n cuando el dispositivo no puede sumergirse en el modo de suspensi贸n (Modo Doze), lo que nuevamente afecta el ahorro de bater铆a.


Brevemente sobre JobIntentService


En esencia, JobIntentService es el mismo IntentService bajo el control del planificador de tareas (JobScheduler).


Ejecutando en el hilo de fondo de AsyncTask.


En las versiones de Android 4.4 y posteriores, se utiliza el IntentService habitual.


Se puede encontrar una descripci贸n detallada en la documentaci贸n.


Ciclo de vida y trampas


Ambos tipos de tareas tienen el mismo ciclo de vida. Las tareas est谩n controladas por Handler y tienen estados.


Aunque estos estados no son accesibles externamente, en ciertas circunstancias el sistema arroja excepciones en las que la aplicaci贸n falla. Estos comportamientos son un problema y un dolor de cabeza para muchos desarrolladores y desafortunadamente no tienen una soluci贸n simple. Para empezar, estudiamos el estado y el ciclo de vida de las tareas, y luego consideramos posibles soluciones.


Secuencia de estado de tarea


imagen
VINCULACI脫N : estado de creaci贸n de tarea (vinculaci贸n de servicio) tiempo de espera 18 segundos
INICIO : estado de inicio de la tarea, tiempo de espera de 8 segundos.
EJECUTANDO - estado de ejecuci贸n de la tarea, tiempo de espera de 10 minutos.
PARADA : estado de detenci贸n de la tarea (por ejemplo, despu茅s de llamar a cancel ()), tiempo de espera de 8 segundos.
FINALIZADO : el estado final de la tarea completada, el 煤ltimo estado en el ciclo de vida de la tarea.


Diagrama simplificado del ciclo de vida de la tarea


imagen
Cada estado de tarea tiene su propio tiempo de espera. Despu茅s de un tiempo de espera, la tarea se interrumpe independientemente de su estado. En realidad, este es un mecanismo de tiempo de espera y es una trampa desde despu茅s del tiempo de espera, el sistema emite una excepci贸n de tipo java.lang.SecurityException y la aplicaci贸n se bloquea con el siguiente mensaje La persona que Caller no longer running, last stopped +1s600ms because: timed out while starting donde +1s600ms es el tiempo transcurrido desde el tiempo de espera en el momento en que se lanz贸 la excepci贸n, y el "motivo" ( because: timed out while starting ) indica el estado de la tarea cuando expir贸 el tiempo de espera.


Conclusiones


Como lo demuestra la experiencia, estas excepciones se encuentran en aplicaciones bastante cargadas.


En apoyo de este problema, uno puede observar tanto en dispositivos d茅biles como en dispositivos superiores. Este problema tambi茅n se indica mediante excepciones lanzadas con mensajes de tiempo de espera. En consecuencia, se sugiere la decisi贸n de descargar la aplicaci贸n y optimizar el uso de JobIntentServices, por ejemplo, para evitar situaciones en las que varios JobIntentServices se inician en paralelo. La segunda soluci贸n, en algunos casos m谩s trivial y, a veces, m谩s complicada que la primera opci贸n, es utilizar JobService.


Adem谩s, si busca en Google este problema, puede encontrar otras opciones "dudosas" para resolver este problema, por ejemplo, puede ver los siguientes enlaces:


Opcion 1
Opci贸n 2
Opci贸n 3


PS


Por el momento, Google est谩 preparando un buen reemplazo para JobService y JobIntentService: esto es Worker y WorkManger del paquete androidx.work.


Desafortunadamente, estas herramientas a煤n no est谩n listas para la producci贸n y tienen una serie de errores, pero ahora, como lo han demostrado las pruebas, resuelven el problema descrito anteriormente.

Source: https://habr.com/ru/post/es432576/


All Articles