개발일지

Android in A..Z - Lifecycle (ViewModelProvider) 본문

Android (안드로이드)/Lifecycle

Android in A..Z - Lifecycle (ViewModelProvider)

강태종 2021. 2. 1. 18:40

ViewModelProvider

ViewModel을 사용할 때 ViewModel을 직접 생성하는 것이 아닌 ViewModelProvider를 통해서 ViewModel를 요청하게 된다.

ViewModel을 직접 생성자를 통해 생성하면 ViewModel을 잘못하용 하는 것이다.


ViewModel 생성과정

 

  1. ViewModelProvider를 통해 ViewModel을 요청한다.
  2. ViewModelProvider생성자로 ViewModelStoreOwner(Activity, Fragment), ViewModelProvider.Factory를 넘겨받는다.
  3. ViewModelProvider는 ViewModelStoreOwner를 참조하여 ViewModelStore에 ViewModel을 요청한다.
  4. ViewModelStore에 인스턴스가 없으면 ViewModelProvider.Factory로 생성하고 ViewModelStore에 저장한다.
  5. ViewModelStore에 저장된 ViewModel 인스턴스를 반환한다.

코드

생성자가 필요한 ViewModel을 사용하는 코드. (ViewModelProvider.Factory를 사용하면 된다.)
private val model by lazy { ViewModelProvider(this, ChronometerViewModelFactory(3000L)).get(ChronometerViewModel::class.java) }
private val model by viewModels<ChronometerViewModel> { ChronometerViewModelFactory(3000L) }


생성자가 필요없는 ViewModel을 사용하는 코드
private val model by lazy { ViewModelProvider(this).get(ChronometerViewModel::class.java) }
private val model by viewModels<ChronometerViewModel>()

 

ChronometerViewModel

class ChronometerViewModel(initialTime: Long = 0L) : ViewModel() {
    var sumOfTickTime = initialTime
    var lastTickTime = 0L

    val recordList by lazy { ArrayList<Record>() }

    val state by lazy { MutableLiveData(State.RESET) }

    enum class State {
        RESET, START, RUN, STOP, RESUME
    }
}

 

ChronometerViewModelFactory

class ChronometerViewModelFactory(private val initialTime: Long) : ViewModelProvider.Factory {
    override fun <T : ViewModel?> create(modelClass: Class<T>): T {
        return ChronometerViewModel(initialTime) as T
    }
}

Git (예제코드)

github.com/KangTaeJong98/Example/tree/main/Android/LifeCycle

 

KangTaeJong98/Example

My Example Code. Contribute to KangTaeJong98/Example development by creating an account on GitHub.

github.com

 

Comments