Sob o capô de um JobIntentService

Neste artigo, falaremos sobre um problema com o JobIntentService, sobre o qual existem muitas perguntas sobre os recursos e relatórios correspondentes no rastreador de erros do Google. E também sobre o motivo pelo qual, a julgar por tudo, o Google não considera um bug e fecha esses relatórios.


1. Introdução


JobIntentServices foram criados para o trabalho em segundo plano. Eles foram amplamente utilizados no Android 8 e superior, quando a capacidade de usar serviços em segundo plano desapareceu.
De fato, eles substituem os serviços em segundo plano e também estão sob o controle do agendador de tarefas (JobScheduler).


Assim, o sistema tem a capacidade de controlar o progresso das tarefas em segundo plano e também controla os próprios wakelocks, o que possibilitou otimizar o consumo de bateria do dispositivo e evitar o uso incorreto de wakelocks pelos desenvolvedores. Essas etapas permitiram minimizar situações em que o dispositivo não pode entrar no modo de suspensão (modo de pausa), o que afeta novamente a economia de bateria.


Brevemente sobre JobIntentService


Em essência, JobIntentService é o mesmo IntentService sob o controle do Agendador de Tarefas (JobScheduler).


Executando no thread de segundo plano do AsyncTask.


Nas versões do Android 4.4 e abaixo, o IntentService usual é usado.


Uma descrição detalhada pode ser encontrada na documentação.


Ciclo de vida e armadilhas


Ambos os tipos de tarefas têm o mesmo ciclo de vida. As tarefas são controladas pelo manipulador e têm estados.


Embora esses estados não sejam acessíveis externamente, sob certas circunstâncias, o sistema lança exceções nas quais o aplicativo falha. Esses comportamentos são um problema e uma dor de cabeça para muitos desenvolvedores e, infelizmente, não têm uma solução simples. Para começar, estudamos o status e o ciclo de vida das tarefas e, em seguida, consideramos possíveis soluções.


Sequência de estado da tarefa


imagem
BINDING - tempo limite do estado de criação da tarefa (ligação de serviço) 18 segundos.
INÍCIO - estado de início da tarefa, tempo limite de 8 segundos.
EXECUTANDO - estado de execução da tarefa, tempo limite de 10 minutos.
STOPPING - estado de parada da tarefa (por exemplo, após chamar cancel ()), tempo limite de 8 segundos.
CONCLUÍDO - o estado final da tarefa concluída, o último estado no ciclo de vida da tarefa.


Diagrama simplificado do ciclo de vida da tarefa


imagem
Cada estado da tarefa tem seu próprio tempo limite. Após um tempo limite, a tarefa é interrompida, independentemente de seu status. Na verdade, este é um mecanismo de tempo limite e é uma armadilha desde após o tempo limite, o sistema lança uma exceção do tipo java.lang.SecurityException e o aplicativo trava com a seguinte mensagem O Caller no longer running, last stopped +1s600ms because: timed out while starting onde +1s600ms é o tempo decorrido desde o tempo limite no momento em que a exceção foi lançada e o "motivo" ( because: timed out while starting ) indica em que estado estava a tarefa quando o tempo limite expirou.


Conclusões


Como mostra a experiência, essas exceções são encontradas em aplicativos bastante carregados.


Para apoiar esse problema, você pode observar os dispositivos fracos e superiores. Esse problema também é indicado por exceções lançadas com mensagens de tempo limite. Consequentemente, a decisão sobre descarregar o aplicativo e otimizar o uso do JobIntentServices sugere-se, por exemplo, para evitar situações em que vários JobIntentServices são iniciados em paralelo. A segunda solução, em alguns casos mais trivial e às vezes mais complicada do que a primeira opção, é usar o JobService.


Além disso, se você pesquisar esse problema no Google, poderá encontrar outras opções "duvidosas" para resolver esse problema, por exemplo, poderá ver os seguintes links:


Opção 1
Opção 2
Opção 3


PS


No momento, o Google está preparando um bom substituto para JobService e JobIntentService - este é o Worker e o WorkManger do pacote androidx.work.


Infelizmente, essas ferramentas ainda não estão prontas para produção e possuem vários bugs, mas agora, como os testes demonstraram, resolvem o problema descrito acima.

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


All Articles