AndroidViewModel과 ViewModel


158

안드로이드 아키텍처 구성 요소 라이브러리의 도입으로, 여러 가지 새로운 클래스를 포함하여, 도입 AndroidViewModelViewModel. 그러나이 두 클래스의 차이점을 알아내는 데 어려움을 겪고 있습니다. 이 설명서AndroidViewModel 는 다음과 같이 간결하게 설명 합니다.

응용 프로그램 컨텍스트 인식 ViewModel

나는 간결함에 감사하지만 이것이 정확히 무엇을 의미합니까? 언제 AndroidViewModel이상 을 사용하도록 선택해야 ViewModel합니까?

답변:


223

AndroidViewModel은 애플리케이션 컨텍스트를 제공합니다.

Viewmodel 내에서 컨텍스트를 사용해야하는 경우 애플리케이션 컨텍스트가 포함되어 있으므로 AndroidViewModel (AVM)을 사용해야합니다. 컨텍스트 호출을 검색하려면 getApplication()일반 ViewModel (VM)을 사용하십시오.

AndroidViewModel에는 애플리케이션 컨텍스트가 있습니다. 우리는 정적 컨텍스트 인스턴스가 메모리 누수를 일으킬 수 있으므로 악하다 는 것을 알고 있습니다 !! 그러나 정적 응용 프로그램 인스턴스를 갖는 것은 실행중인 응용 프로그램에 하나의 응용 프로그램 인스턴스 만 있기 때문에 생각하는 것만 큼 나쁘지 않습니다 .

따라서 특정 클래스에서 Application 인스턴스를 사용하고 갖는 것은 일반적으로 문제가되지 않습니다. 그러나 Application 인스턴스가이를 참조하는 경우 참조주기 문제로 인해 문제가됩니다.

응용 프로그램 인스턴스에 대한 참조

단위 테스트에 문제가있는 AndroidViewModel

AVM은 장치 테스트에 문제가되는 응용 프로그램 컨텍스트를 제공합니다. 단위 테스트는 컨텍스트와 같은 Android 수명주기를 다루지 않아야합니다.


40
왜 항상 AndroidViewModel을 사용하지 않습니까? 나중에 필요하지 않더라도 나중에 컨텍스트가 필요할 수 있습니다. 단점이 있습니까?
T. Rex

19
@ T.Rex 코드를 보면 ViewModel응용 프로그램을 가리키는 필드로 확장 됩니다. 필요하지 않은 경우 Application매개 변수 ( 필수)가있는 필수 생성자를 AndroidViewModel사용하지 않고 오히려을 사용 ViewModel합니다. 앞으로 상황이 필요할 때 쉽게 바꿀 수 있습니다.
소년

3
사용 ViewModel하면 조각 또는 공유로 사용하고자 할 때 ViewModel같은 활동의 다른 조각 사이.
codelearner

22
T.Rex @ 사용하지 않는 것 AndroidViewModel- 인 Context의존성 - 불가능 정기적으로 단위 테스트에서 테스트 할 수 있도록, 가능성으로 만 계측 테스트를 떠나? 나는 스스로 장난감을 가지고 있지는 않았지만 (아직도) 단지 생각입니다
Konrad Morawski

2
AndroidViewModel과 ViewModel은 동일하지만 유일한 차이점은 AndroidViewModel에 애플리케이션 컨텍스트가 포함되어 있다는 것입니다. ViewModel을 사용하고 컨텍스트를 ViewModel에 전달하여 MediaStore에서 데이터를로드하거나 애플리케이션 컨텍스트와 함께 AndroidViewModel을 사용할 수 있습니다.
Alex

10

마지막으로 조금 더 간단한 설명이 있습니다 ... ... AndroidViewModel 클래스는 ViewModel의 하위 클래스이며 이와 유사하며 UI 관련 데이터를 저장하고 관리하도록 설계되어 데이터를 준비하고 제공해야합니다. UI의 경우에도 구성 변경시에도 데이터가 자동으로 유지됩니다.

AndroidViewModel과의 유일한 차이점은 응용 프로그램 컨텍스트와 함께 제공 되므로 시스템 서비스를 받기 위해 컨텍스트가 필요하거나 비슷한 요구 사항이있는 경우 유용합니다. 굵은 글씨는 더 명확하게 감지합니다.



4

AndroidViewModelViewModel의 서브 클래스입니다 . 차이점은 예를 들어 데이터베이스를 리포지토리에서 인스턴스화하기 위해 응용 프로그램 컨텍스트가 필요할 때마다 사용할 수있는 응용 프로그램 컨텍스트를 전달할 수 있다는 것입니다.

AndroidViewModelViewContext를 인식하는 애플리케이션 컨텍스트입니다.

AndroidViewModel :

public class PriceViewModel extends AndroidViewModel {
private PriceRepository priceRepository;

public PriceViewModel(@NonNull Application application) {
    super(application);
    priceRepository= new PriceRepository(application);
    allPrices = priceRepository.getAllPrices();
}

뷰 모델 :

public class PriceViewModel extends ViewModel {
public PriceViewModel() {
    super();
}

애플리케이션 컨텍스트가 필요한 경우에만 AndroidViewModel을 사용해야합니다 .

ViewModel에서 활동에 대한 참조 또는 활동을 참조하는보기를 저장해서는 안됩니다. ViewModel은 활동보다 오래 지속되도록 설계되어 메모리 누수를 유발할 수 있습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.