Meu plugin minha vida — BackGround Services
Fala galera,
Beleza?
Acho que uma pergunta e um assunto comum que eu sempre vejo o pessoal falar , é sobre como executar tarefas em background.
Como o app do facebook por exemplo, que atualiza seu feed.
Eu poderia fazer um Artigo explicando como fazer isso com Xamarin.Android e Xamarin.iOS, mas porque não com Xamarin.Forms?
Este sera o ultimo artigo da Serie do Leitor de RSS, que eu comecei apenas mostrando um plugin da Microsoft que faz isso, mas graças a Alguns feedbacks que recebi, me perguntando outras coisas eu resolvi fazer 3 artigos e completar o app :D
Por isso, me mandem feedbacks. Pode ser pelo próprio Medium , ou pelo twitter . Se eu conhecer sobre o assunto/controle/plugin, sera um prazer lhe ajudar e fazer um artigo ;) .
Antes de continuar devo avisar que é bom você ler e implementar os artigos :
· Meu Plugin minha vida — Lendo RSS com Xamarin.Forms
· O X do Xamarin Forms — Armazenando cache com Monkey Cache :P
Pois utilizarei o código gerado dos dois, para implementar o Serviço em Background.
Como disse existe uma forma de fazer isso nativo nas plataformas, mas existe um plugin sensacional que resolve isso : Matcha.BackgroundService.
Bora ver como utiliza-lo :D
Configurando o plugin
Vamos ao nuget instalar o pacote Matcha.BackgroundService,instale em todos os projetos :
Warning: Estou utilizando o projeto ExemploMonkeyCache para demonstrar esse plugin. Não se esqueça de ver os artigos anteriores!
Vamos inicializar o plugin no iOS:
E no Android:
Perfeito! Agora vamos alterar nosso App de RSS para atualizar em BackGround!
Implementando o Plugin
Primeiro precisamos criar uma classe que implemente a IPeriodicTask, que sera responsável por executar a tarefa:
Em seguida, vamos implementar para que obtenha o RSS e grave em nosso MonkeyCache:
Como podem ver eu apenas coloquei o código GravarRSS() que existia na MainViewModel.
Agora vamos alterar nossa MainViewModel :
Basicamente, nós comentamos o método de gravar e no carregar eu adicionei uma verificação para ele apenas exibir a lista após o primeiro carregamento do nosso cache.
Agora para funcionar, vamos iniciar o BackGroundService no App.cs, configurando para verificar a cada minuto :
Pronto! Vamos rodar :
Assim que abrir ele vai aguardar o cache estar preenchido, em seguida exibir a lista.
Agora a cada 1 minuto, ele verifica se existem informações novas e atualiza o Cache.
Ao usuário puxar para atualizar ou abrir o app novamente, as informações ja estarão atualizadas.
Acabou ? Não, eu sei o que você esta pensando, mas eu queria que fosse automático .. Ok,Vamos alterar as coisas mais uma vez :D
Nessa caso vamos receber ajuda do nosso querido MessagingCenter, vamos utilizar ele para avisar o feed , quando o RSS for atualizado.
Mas lembre-se , isto é apenas para demonstrar um update automático. É sempre bom pensar na usabilidade, você não gostaria de um Feed atualizando a cada 1 minuto na sua cara , não é ?
Outro ponto que vou ressaltar, é que estou apenas utilizando o MessagingCenter para demonstrar no exemplo, podem existir formas melhores.. Cada caso é um caso.
Vamos alterar o MainViewModel.cs , para adicionar o MessagingCenter, e alterar o método CarregarRSS:
A ideia é assim que o app Abrir Carregar o Feed do Cache, possibilitar o usuário verificar se existem novos RSS ao puxar, e atualizara o Feed Automaticamente se existirem novos dados.
Notem que no próprio messagingCenter eu recebo a coleção de objetos, ela sera enviada assim que existirem novos dados.
Agora vamos alterar o PeriodicRSSFeedService, criando uma variável auxiliar ,para caso existe pelo menos 1 item novo, ele avise ao messagingCenter :
Pronto! Agora ao abrir você pode ver, que após o serviço carregar a lista atualiza sozinha.
Bacana não ? Se quiserem depois posso escrever um artigo falando só do MessagingCenter :D ( que eu tenho medo de algumas gambiarras que são feitas por alguns neles … prefiro nem comentar :P ..)
Se quiserem podem baixar o exemplo utilizado clicando aqui.
Quer ver outros artigos sobre Xamarin ? Clique aqui.
Espero ter ajudado!
Aquele abraço!