Solucionado (ver solução)
Solucionado
(ver solução)
6
respostas

Dúvida sobre cache

No vídeo, tornando o MutableLiveData um property, foi nomeado a mesma como "noticiasEncontradas", mas foi feito o seguinte comentário: o nome poderia ser noticiasCacheadas.

Trabalhando com o android, esse é o conceito ideal para trabalhar com cache ou existem outras formas melhores ou indicadas pela documentação?

Desde já obrigado.

6 respostas
solução!

Oi Matheus, tudo bem?

Tudo vai depender muito do que você pretende fazer, por exemplo, o cache que você quer implementar é algo que vai ficar disponível mesmo que sua aplicação seja destruída? É algo que pretende aplicar expiração?

No nosso exemplo o cache entrou para casos em que rotacionamos a tela e de imediato temos acesso ao último dado carregado pelo LiveData, isso considerando a integração que temos com o ViewModel.

Portanto, não é algo que atende a um cenário genérico de cache que tem até mecanismo de expiração para a disponibilidade do dado e necessidade busca da fonte (database ou web api).

O que temos como solução de armazenamento de dados são as storage options, como é caso de armazenamento de arquivos, Shared Preferences (tipos primitivos) e SQLite que é o que já usamos.

[]s

Certo, entendi.

O meu cenário é mais ou menos assim: tenho uma aplicação online, onde busco em um servidor uma lista de dados e apresento elas na tela. O problema é, que da forma em que foi feito, toda vez que entro na tela, ele busca essas informações na API e o loading é apresentado. Como são várias telas, vários loading's acontecem.

O que eu queria é que essa busca na API, na segunda vez fosse "mais rápida", já que o sistema buscou uma vez. Mas não sei se isso é possível, talvez tenha que usar uma estratégia para não buscar os dados toda vez.

Oi Matheus, essa busca direta na API pode ser o problema.

A alternativa que você teria é usar a técnica single source of truth ou única fonte de verdade que visa buscar as informações apenas do banco de dados.

Dessa forma, você faz a pesquisa no banco, que é mais rápida, tem os dados disponíveis e ao mesmo tempo roda a tarefa em plano de fundo para buscar as informações na API, caso tenha sucesso você ajusta no banco de dados com as atualizações e notifica o LiveData que tem conteúdo novo.

Inclusive é apresentado esses detalhes na última aula do curso quando integramos o Room com o LiveData :)

[]s

Sim, vi isso no curso e realmente achei interessante. No meu caso teria um pouco de impacto pois precisaria estruturar toda a aplicação para a técnica single source of truth e usar essa fonte como o banco.

Minha preocupação é a seguinte: 1 - essa realmente seria a melhor forma? é indicado seguir essa técnica pela documentação? 2 - pensando na aplicação, digamos que carrego os itens na tela, buscando do banco, e em background o sistema vai buscar os dados na API. Digamos que o usuário já fez um scroll na tela, quando a api me retornar com os dados, ele não vai recarregar os itens da página tornando a experiência do usuário ruim?

Valeuuu.

Você tem toda razão, esse tipo de mudança é custosa, então é importante avaliar todo o contexto e fluxo para entender se faz sentido ou não, logo, vai de caso a caso.

1 -> Melhor é subjetivo, não é possível avaliar com a solução suprema, pois cada caso vai exigir peculiaridades, portanto, pode ser classificada como uma solução recomendada pela documentação, você pode conferir mais a partir desta fonte.

2 -> Perfeita pergunta! Tudo vai depender da estratégia que fizer nesse fluxo, existem implementações de APIs que usam versões de dados para devolver apenas um diff (apenas o conteúdo diferente/novo do que já existe), dessa forma, você pode indicar a versão dos dados que tem e a API usa esse parâmetro verificar se tem algo novo e devolver apenas o que é novo.

Sobre recarregar a página por solicitação, você pode até mesmo considerar algumas implementações do RecyclerView que usa um DiffCallback para substituir apenas o conteúdo novo, como é o caso do ListAdapter ou o PagedListAdapter que é vinculado com o Archictecture Component Paging.

[]s

Valeu Alex. Já me esclareceu bastante as minhas dúvidas.

Obrigado. Abrass.