Quando usar um serviço no Android
-
25-09-2019 - |
Pergunta
Eu tenho uma classe que busca dados em resposta às pressões de botão na atividade principal. Infelizmente, continuo encontrando problemas porque essa classe não é uma atividade ou um serviço. Por exemplo, sem um contexto, não posso traduzir um ID de recurso em uma string:
getString(R.string.example_string); // Doesn't work
Devo transformar essa aula em um serviço e fazer com que a atividade principal pare a classe quando estiver fechada? Devo passar o contexto da atividade para esta classe como essa?
MyClass c = new MyClass(this);
Ou existe uma maneira melhor de lidar com esse problema?
Esse problema também surge quando tento enviar uma torrada desta classe.
Atualizar: Erich e Janusz me apontaram na direção do AsyncTask
A classe que funciona perfeitamente, exceto que cria um novo tópico e nunca mata esse tópico. Isso significa que, sempre, o usuário pressiona um botão, outro thread é adicionado e os antigos apenas sentam lá.
Solução
Se você tem uma ação de fundo cujo ciclo de vida é dissociado de sua atividade, eu usaria um Service
. Nesse caso, o Service
terá seu próprio Context
, então você não precisará passar por isso. Se, no entanto, precisar executar uma ação em segundo plano em resposta a um evento da interface do usuário (e opcionalmente postar os resultados de volta no tópico da interface do usuário), eu recomendaria que você use um AsyncTask
.
Outras dicas
Eu concordo com Erich, se você só tem algo pequeno, como postar uma alteração em um back -end da web ou carregar algo da memória do telefone para mostrá -lo na tela, use um Tarefa assíncrona. Se a tarefa sairá muito "rápida" (alguns segundos), você poderá fazer uma aula anônima dentro de sua atividade. Isso permitirá que você use uma referência implícita à atividade externa dentro da tarefa e você poderá obter seu contexto a partir daí.
Se a tarefa estiver em execução por mais tempo, você poderá passar o contexto. Se você estiver passando pelo contexto, tente não passar por isso da atividade, use isso.getApplicationContext (), isso minimizará o número de referências à sua atividade e permitirá que o coletor de lixo limpe corretamente.