AAC ViewModel이란?
- Android의 수명 주기를 고려하여 UI 관련 데이터를 저장하고 관리하도록 설계되었다. AAC ViewModel을 사용하면 기존의 Activity 생명주기 때문에 데이터 관리 측면에서 겪던 어려움들을 간단하게 처리할 수 있다.
ViewModel 생명주기
- Activity가 생성되고 파괴되기 전까지 ViewModel은 파괴되지 않고 유지된다. 이 때문에 데이터를 유지할 수 있습니다. 새 소유자 인스턴스가 기존 모델에 다시 연결됩니다. 이 뷰 모델이 더 이상 사용되지 않고 삭제될 때 onCleared() 메서드가 호출된다. ViewModel은 VIewModelStoreOwner 인터페이스 내부의 ViewModelStore에 Key Value 쌍으로 저장된다.
ViewModelProvider
VIewModel 인스턴스를 만들기 위해서 ViewModelProvider를 사용해야 한다.
ViewModelProvider는 ViewModelStoreOwner 인터페이스를 구현하는 인스턴스를 인자로 받는다. 이로부터 Activity와 Fragment가 ViewModelStoreOwner 인터페이스를 구현함을 알 수 있고, View(Activity, Fragment) 인스턴스의 Lifecycle을 이용해 ViewModel을 제공함을 알 수 있다.
viewModel 초기화 방법
1. ViewModelProvider를 이용한 초기화, 파라미터가 없는 경우
val viewModel = ViewModelProvider(this@MainActivity).get(MainViewmModel::class.java)
위의 설명대로 ViewModelProvider의 파라미터로 MainAcitivty(View)를 전달하고 그로부터 ViewModel Class를 넣어 VIewModel을 get 한다. 이로부터 생겨난 ViewModel은 MainActivity의 Lifecycle을 따르는 ViewModel이 된다.
2. by viewModels()
코틀린 ktx를 활용한 초기화 방법도 있다. 이 방법을 사용하면 ViewModelProvider를 사용하지 않고 viewModel을 지연 생성할 수 있다. 이 초기화를 사용하기 위해서는 모듈 수준의 build.gradle에 세팅을 해야 한다.
dependencies {
implementation "androidx.fragment:fragment-ktx:1.4.1"
implementation 'androidx.activity:activity-ktx:1.4.0'
}
val viewModel: MainViewModel by viewModels()
3. ViewModel 파라미터가 있는 경우
생성자 파라미터가 있는 경우에는 Factory Class를 직접 만들어서 넣어 주어야 한다.
class MainViewModel(val repository: MainRepository) : ViewModel()
class MainViewModelFactory(private val repository: MainRepository) : ViewModelProvider.Factory {
override fun <T : ViewModel?> create(modelClass: Class<T>): T {
return if (modelClass.isAssignableFrom(MainViewModel::class.java)) {
MainViewModel(repository) as T
} else {
throw IllegalArgumentException()
}
}
}
class MainActivity : AppCompatActivity() {
private lateinit var mainViewModel: MainViewModel
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
val repository = MainRepository()
mainViewModel = ViewModelProvider(this, MainViewModelFactory(repository))
.get(MainViewModel::class.java)
}
}
viewModel + Dagger2
추후 추가 예정
'안드로이드' 카테고리의 다른 글
[Compose] 이펙트 핸들러(Effect Handler) (1) | 2024.06.12 |
---|---|
WebView Bridge (0) | 2024.03.27 |
인텐트(Intent) (0) | 2022.05.09 |
Android Studio 단축키 (0) | 2021.12.23 |
[안드로이드] Looper, Handler (0) | 2021.01.20 |