Pergunta

Aqui está o cenário:

  1. Eu tenho 2 atividades e um serviço
  2. A primeira atividade é uma página de vista/pesquisa de pouso. A segunda atividade exibe resultados de pesquisa
  3. A pesquisa é sempre executada contra o sqlite interno DB
  4. Periodicamente (digamos diariamente) o dB precisa ser atualizado a partir da fonte remota, que é um processo longo
  5. 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.
  6. 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
  7. 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 com IllegalMonitorStateException.

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?

Foi útil?

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:

  1. Em vez de cutucar o banco de dados, simplesmente vincule -se ao serviço e comece a esperar
  2. 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
  3. 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
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top