Com a introdução da biblioteca Android Architecture Components, várias novas classes foram introduzidas, incluindo AndroidViewModele ViewModel. No entanto, estou tendo problemas para descobrir a diferença entre essas duas classes. A documentação descreve sucintamente da AndroidViewModelseguinte maneira:
Ciente do contexto do aplicativo ViewModel
Aprecio a brevidade, mas o que exatamente isso implica? Quando devemos escolher usar AndroidViewModelo ViewModelcontrário e vice-versa?
Se você precisar usar o contexto no seu Viewmodel, use o AndroidViewModel (AVM), pois ele contém o contexto do aplicativo. Para recuperar a chamada de contexto getApplication(), use o ViewModel (VM) comum.
AndroidViewModel tem contexto de aplicativo . Todos nós sabemos que ter uma instância de contexto estático é ruim, pois pode causar vazamentos de memória! No entanto, ter uma instância estática do aplicativo não é tão ruim quanto você imagina, porque há apenas uma instância do aplicativo no aplicativo em execução.
Portanto, usar e ter instância de Aplicativo em uma classe específica não é um problema em geral. Mas, se uma instância de Aplicativo os referenciar, será um problema devido ao problema do ciclo de referência.
AndroidViewModel Problematic para testes de unidade
O AVM fornece um contexto de aplicativo problemático para testes de unidade. Os testes de unidade não devem lidar com nenhum ciclo de vida do Android, como o contexto.
Por que nem sempre usar o AndroidViewModel? você pode precisar mais tarde do contexto, mesmo que não precise agora. Existe alguma desvantagem nisso?
T. Rex
20
@ T.Rex Se você olhar para o código, ele se estende ViewModelapenas com um campo apontando para Aplicativo. Se eu não precisar, não gosto de ter um construtor obrigatório com o Applicationparâmetro (que AndroidViewModelrequer) e apenas usar ViewModel. Quando preciso de um contexto no futuro, posso alterá-lo facilmente.
Boy
3
Use ViewModelquando quiser usá-lo com Fragmento ou para compartilhar ViewModelentre diferentes fragmentos da mesma Atividade.
Codelearner 27/01
22
@ T.Rex não usaria AndroidViewModel- sendo Contextdependente - impossibilitá-lo em um teste de unidade regular, deixando apenas os testes de instrumentação como uma possibilidade? Eu não brincava com isso sozinho (ainda), é apenas um pensamento
Konrad Morawski
2
AndroidViewModel e ViewModel são os mesmos, a única diferença é que AndroidViewModel contém o contexto do aplicativo. Você pode usar o ViewModel e passar o contexto para o ViewModel para funcionar com o carregamento de dados do MediaStore ou usar o AndroidViewModel com o contexto do aplicativo.
Alex
10
Finalmente, obtive uma explicação mais simples, um pouco ...... ... A classe AndroidViewModel é uma subclasse de ViewModel e semelhante a eles, eles são projetados para armazenar e gerenciar dados relacionados à interface do usuário, responsáveis por preparar e fornecer dados para interface do usuário e permitir automaticamente que os dados sobrevivam às alterações na configuração.
A única diferença com o AndroidViewModel é que ele vem com o contexto do aplicativo, o que é útil se você precisar de contexto para obter um serviço do sistema ou tiver um requisito semelhante. o texto em negrito torna mais claro o sentido.
AndroidViewModel é uma subclasse de ViewModel . A diferença entre eles é que podemos passar o Contexto do Aplicativo, que pode ser usado sempre que o Contexto do Aplicativo for necessário, por exemplo, para instanciar o Banco de Dados no Repositório.
AndroidViewModel é um ViewModel que reconhece o contexto do aplicativo.
AndroidViewModel:
public class PriceViewModel extends AndroidViewModel {
private PriceRepository priceRepository;
public PriceViewModel(@NonNull Application application) {
super(application);
priceRepository= new PriceRepository(application);
allPrices = priceRepository.getAllPrices();
}
ViewModel:
public class PriceViewModel extends ViewModel {
public PriceViewModel() {
super();
}
Você deve usar o AndroidViewModel somente quando precisar do Contexto do Aplicativo.
Você nunca deve armazenar uma referência de atividade ou uma exibição que faça referência a uma atividade no ViewModel. Porque o ViewModel foi projetado para sobreviver a uma atividade e causará vazamento de memória.
ViewModel
apenas com um campo apontando para Aplicativo. Se eu não precisar, não gosto de ter um construtor obrigatório com oApplication
parâmetro (queAndroidViewModel
requer) e apenas usarViewModel
. Quando preciso de um contexto no futuro, posso alterá-lo facilmente.ViewModel
quando quiser usá-lo com Fragmento ou para compartilharViewModel
entre diferentes fragmentos da mesma Atividade.AndroidViewModel
- sendoContext
dependente - impossibilitá-lo em um teste de unidade regular, deixando apenas os testes de instrumentação como uma possibilidade? Eu não brincava com isso sozinho (ainda), é apenas um pensamentoFinalmente, obtive uma explicação mais simples, um pouco ...... ... A classe AndroidViewModel é uma subclasse de ViewModel e semelhante a eles, eles são projetados para armazenar e gerenciar dados relacionados à interface do usuário, responsáveis por preparar e fornecer dados para interface do usuário e permitir automaticamente que os dados sobrevivam às alterações na configuração.
A única diferença com o AndroidViewModel é que ele vem com o contexto do aplicativo, o que é útil se você precisar de contexto para obter um serviço do sistema ou tiver um requisito semelhante. o texto em negrito torna mais claro o sentido.
fonte
AndroidViewModel é uma subclasse de ViewModel . A diferença entre eles é que podemos passar o Contexto do Aplicativo, que pode ser usado sempre que o Contexto do Aplicativo for necessário, por exemplo, para instanciar o Banco de Dados no Repositório.
AndroidViewModel:
ViewModel:
Você nunca deve armazenar uma referência de atividade ou uma exibição que faça referência a uma atividade no ViewModel. Porque o ViewModel foi projetado para sobreviver a uma atividade e causará vazamento de memória.
fonte