AndroidViewModel vs ViewModel

159

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?

cascal
fonte

Respostas:

223

AndroidViewModel fornece contexto de aplicativo

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.

Consulte também sobre a instância do aplicativo

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.

Alex
fonte
42
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.

user9830926
fonte
1
fonte oficial medium.com/androiddevelopers/…
Neeraj Sewani 18/01
4

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.

John
fonte