답변:
Viewmodel 내에서 컨텍스트를 사용해야하는 경우 애플리케이션 컨텍스트가 포함되어 있으므로 AndroidViewModel (AVM)을 사용해야합니다. 컨텍스트 호출을 검색하려면 getApplication()
일반 ViewModel (VM)을 사용하십시오.
AndroidViewModel에는 애플리케이션 컨텍스트가 있습니다. 우리는 정적 컨텍스트 인스턴스가 메모리 누수를 일으킬 수 있으므로 악하다 는 것을 알고 있습니다 !! 그러나 정적 응용 프로그램 인스턴스를 갖는 것은 실행중인 응용 프로그램에 하나의 응용 프로그램 인스턴스 만 있기 때문에 생각하는 것만 큼 나쁘지 않습니다 .
따라서 특정 클래스에서 Application 인스턴스를 사용하고 갖는 것은 일반적으로 문제가되지 않습니다. 그러나 Application 인스턴스가이를 참조하는 경우 참조주기 문제로 인해 문제가됩니다.
AVM은 장치 테스트에 문제가되는 응용 프로그램 컨텍스트를 제공합니다. 단위 테스트는 컨텍스트와 같은 Android 수명주기를 다루지 않아야합니다.
ViewModel
응용 프로그램을 가리키는 필드로 확장 됩니다. 필요하지 않은 경우 Application
매개 변수 ( 필수)가있는 필수 생성자를 AndroidViewModel
사용하지 않고 오히려을 사용 ViewModel
합니다. 앞으로 상황이 필요할 때 쉽게 바꿀 수 있습니다.
ViewModel
하면 조각 또는 공유로 사용하고자 할 때 ViewModel
같은 활동의 다른 조각 사이.
AndroidViewModel
- 인 Context
의존성 - 불가능 정기적으로 단위 테스트에서 테스트 할 수 있도록, 가능성으로 만 계측 테스트를 떠나? 나는 스스로 장난감을 가지고 있지는 않았지만 (아직도) 단지 생각입니다
마지막으로 조금 더 간단한 설명이 있습니다 ... ... AndroidViewModel 클래스는 ViewModel의 하위 클래스이며 이와 유사하며 UI 관련 데이터를 저장하고 관리하도록 설계되어 데이터를 준비하고 제공해야합니다. UI의 경우에도 구성 변경시에도 데이터가 자동으로 유지됩니다.
AndroidViewModel과의 유일한 차이점은 응용 프로그램 컨텍스트와 함께 제공 되므로 시스템 서비스를 받기 위해 컨텍스트가 필요하거나 비슷한 요구 사항이있는 경우 유용합니다. 굵은 글씨는 더 명확하게 감지합니다.
AndroidViewModel 은 ViewModel의 서브 클래스입니다 . 차이점은 예를 들어 데이터베이스를 리포지토리에서 인스턴스화하기 위해 응용 프로그램 컨텍스트가 필요할 때마다 사용할 수있는 응용 프로그램 컨텍스트를 전달할 수 있다는 것입니다.
AndroidViewModel 은 ViewContext를 인식하는 애플리케이션 컨텍스트입니다.
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은 활동보다 오래 지속되도록 설계되어 메모리 누수를 유발할 수 있습니다.