Android: como esperar corretamente na conclusão do processo de serviço
-
21-09-2019 - |
Pergunta
Aqui está o cenário:
- Eu tenho 2 atividades e um serviço
- A primeira atividade é uma página de vista/pesquisa de pouso. A segunda atividade exibe resultados de pesquisa
- A pesquisa é sempre executada contra o sqlite interno DB
- Periodicamente (digamos diariamente) o dB precisa ser atualizado a partir da fonte remota, que é um processo longo
- Se o usuário executar a pesquisa durante a atualização, quero esperar até que a atualização termine durante o alerta de progresso "aguarde". Não quero consultar e exibir os resultados da pesquisa até que a atualização seja totalmente concluída.
- A atualização do banco de dados é acionada pelo AlarmManager e executada por serviço, que coloca o status de "atualização" em dB enquanto a atualização está em andamento
- Posso consultar facilmente o status, mas como espero e periodicamente re-interveio ao banco de dados? Estou usando o ASYNCTASK para processar os resultados da pesquisa e minha reação brusca foi colocar um loop com espera ()
AsyncTask#doInBackground
método, mas isso é perigoso e simplesmente não funciona, pois não estou controlando o tópico da interface do usuário, então acabo comIllegalMonitorStateException
.
Qual seria uma maneira "certa" de esperar adequadamente (pode ser mesmo com atualização de status) neste caso?
PS Coloquei o código "Wait" em um executável e executando -o mesmo antes de chegar à minha assíncada. Funciona, por exemplo Thread.sleep(2000)
Ainda não tenho certeza se é essa a maneira de fazê -lo com segurança. Alguém tem alguma experiência com FutureTask
?
Solução
Se o usuário executar a pesquisa durante a atualização, quero esperar até que a atualização termine durante o alerta de progresso "aguarde". Não quero consultar e exibir os resultados da pesquisa até que a atualização seja totalmente concluída.
Essa é a sua ligação, mas lembre -se de que você está criando seu próprio problema. Pessoalmente, eu despejaria esse requisito. O usuário não deve ser incomodado apenas porque um alarme disparou.
Por exemplo, você pode desativar o alarme e reativá-lo quando a atividade desaparecer.
Ou, que a atualização seja executada de tal maneira que seja atômica (por exemplo, faça a atualização em uma cópia da tabela e sincronize as tabelas em uma transação), para que a atividade ainda possa acessar com segurança o banco de dados enquanto a atualização está ocorrendo.
Qual seria uma maneira "certa" de esperar adequadamente (pode ser mesmo com atualização de status) neste caso?
Peça ao serviço informar a atividade quando a atualização for concluída, por meio de algum tipo de retorno de chamada, ou talvez uma intenção de transmissão. Mantenha o indicador de progresso vivo até que isso ocorra. Isso ainda apresenta alguns desafios de tempo, e é por isso que eu apenas despejava o requisito.
Outras dicas
Obrigado a Mark (como sempre) pelas idéias úteis. Aqui, vou descrever como (em minha mente) o cenário acima deve ser feito:
- Em vez de cutucar o banco de dados, simplesmente vincule -se ao serviço e comece a esperar
- Se você não pode se vincular ao serviço, ele não está funcionando, então não há necessidade de macacão com ele - basta consultar o banco de dados e fazer o que você precisa
- Quando o serviço terminar, comece a esperar e processe qualquer feedback que o serviço envie de volta. Estas podem ser atualizações provisórias e, em seguida, indicador final que o serviço é feito