본문 바로가기

안드로이드/Jetpack

[안드로이드] ViewModel

안드로이드 공식문서

https://developer.android.com/topic/libraries/architecture/viewmodel?hl=ko

 

ViewModel 개요  |  Android 개발자  |  Android Developers

ViewModel을 사용하면 수명 주기를 인식하는 방식으로 UI 데이터를 관리할 수 있습니다.

developer.android.com

 

ViewModel

ViewModel은 UI에 표시되는 데이터를 보유한 일반적인 클래스이다.

 

일반적으로 화면을 회전하거나 어떠한 활동을 할  때, 인스턴스 상태 저장 메커니즘을 사용하지 않으면 데이터가 소멸되는 문제가 생길 수 있다.

 

화면 회전을 하였는데 기존의 데이터와 달라져 버릴 수 있는 것이다.

 

ViewModel은 데이터 지속성 을 위한 편리한 API를 제공하기 때문에 이러한 문제들을 해결할 수 있다.

 

지속성

ViewModel은 ViewModel이 보유하는 상태와 ViewModel이 트리거하는 작업에서 모두 지속성을 허용
이러한 캐싱을 통해 화면 회전과 같은 일반적인 구성 변경에도 데이터를 다시 가져올 필요가 없다.

 

 

범위

ViewModel의 범위로 지정된 프래그먼트 또는 액티비티가 소멸되면 범위가 지정된 ViewModel에서 비동기 작업이 계속된다.

 

ViewModel 수명주기 출처 Android 공식문서

 

 

 

ViewModel의 생명 주기는 다음과 같다.

 

Activity의 회전이 일어나면 다음과 같이 상태를 파괴하고 재생성 된다.

 

그러나 ViewModel의 상태는 비동기 상태에서 사라지지 않으므로 데이터는 유지 된다.

 

또한 finish()로 Activity 또는 Fragment가 완전히 소멸되면 ViewModel 또한 같이 종료된다.

 

 

 

 

 

 

 

 

 

사용 방법

ViewModel

class TestViewModel : ViewModel() {
    // Expose screen UI state
    private val _data = MutableLiveData<T>()
    val data: LiveData<T> = _data
    
    init{
    	//viewmodel 생성 시 실행
    }

    // Handle business logic
    fun testFunc(a : T) {
        _data.postValue(a)
    }
}

 

Activity

class MainActivity : AppCompatActivity() {
    private val viewModel : TestViewModel by viewModels()
    
    override fun onCreate(savedInstanceState: Bundle?) {
    	...
        
        viewModel.data.observe(this){
        	//LiveData인 data를 관찰, 변화가 생기면 이벤트 발생 
            Log.d("data", "$it")
        }
        
        //ViewModel의 함수의 반환 값이 LiveData라면 함수도 관찰 가능하다.
        viewModel.func().observe(this){
        	Log.d("data", "$it")
        }
    }
}

 

Fragment

viewModel.data.observe(viewLifecycleOwner){
    Log.d("data", "$it")
}

 

'안드로이드 > Jetpack' 카테고리의 다른 글

[안드로이드] Navigation Component  (0) 2023.11.29
[안드로이드] Jetpack  (0) 2023.11.24
[안드로이드] LiveData  (1) 2023.11.23
[안드로이드] Databinding  (1) 2023.11.23
[안드로이드] Room DB  (0) 2023.11.23