1
resposta

Qual a melhor forma de sincronizar dados em segundo plano?

Olá, primeiro vou contar a história do meu problema:

Tenho uma aplicação que sincroniza dados em segundo plano com um servidor de tempos em tempos. Ou seja, conforme usuário usa a aplicação, ao mesmo tempo ela faz download/upload das informações, e isso é informado ao usuário através de uma notificação. Essa sincronização é feita pois necessito dos dados para a aplicação funcionar de forma offline. O problema é que a quantidade de dados a serem sincronizadas é BEMMMMM grande.

Dúvida:

Gostaria de saber qual é a melhor forma de sincronizar esses dados em segundo plano. Hoje utilizo um Service/Runnable, mas percebo que a aplicação as vezes trava alguns segundos, como se a thread principal fosse afetada. Qual seria minha melhor solução? Usar thread? Async Task? Lembrando sempre que a quantidade de informações é bem grande, sendo que preciso de bastante tempo pra sincronizar, as vezes demorando de 10 minutos até 1 hora.

Obrigado.

1 resposta

Oi Matheus,

realmente seu app está usando muito tempo para sincronizar dados. Será que seu app precisa mesmo de todos esses dados para funcionar offline? Talvez seja melhor reestruturar seu aplicativo para usar menos dados e, consequentemente, diminuir esse tempo de sincronização.

Uma coisa importante: o Android vem constantemente se atualizando para restringir o consumo de hardware ao fazer tarefas em segundo plano. Então, um app que precisa de 10 minutos para sincronizar dados certamente terá cada vez mais problemas para essa tarefa.

De qualquer forma, o travamento pode ser justificado por um detalhe: ao usar um Service, você garante que a tarefa rodará sem a interação com o usuário, mas não numa thread separada (é por isso que você teve que usar um Runnable dentro desse Service). Porém, o Android já tem isso pronto: o IntentService, que roda numa thread separada por padrão.

Uma outra ideia é usar o GcmTaskService, que permite uma melhor configuração de condições necessárias para que a tarefa (no caso, a sincronização com o servidor) aconteça. Por exemplo, podemos dizer que a tarefa só será executada caso o aparelho esteja no WiFi e carregando.