ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • ViewModel
    Android 2021. 5. 28. 13:27

    ViewModel 클래스는 lifecycle를 고려하여 UI 관련 데이터를 저장하고 관리하도록 설계되었다. ViewModel 클래스를 사용하면 화면 회전과 같이 구성을 변경할 때도 데이터를 유지할 수 있다.

    ViewModel 생명주기

    ViewModelActivity에서는 Activity가 끝날 때까지 그리고 Fragment에서는 Fragment가 분리될 때까지 메모리에 남아 있다.


    Activity의 경우 기기 화면이 회전될 때와 같이 onCreate() 메서드가 여러 번 호출될 수 있지만 ViewModel은 소멸되지 않고 계속 유지된다. ViewModel은 ScopeOwner가 Destroyed 상태가 되면 onCleared()를 호출하여 ViewModel을 Release한다.

    ViewModel 구현하기

    ViewModel 라이브러리는 내부적으로 프래그먼트를 사용한다.
    ViewModel은 추상클래스(abstract)이며 상속만으로 ViewModel클래스 생성가능하다

    class MainViewModel : ViewModel() { override fun onCleared() { // Do somthing to clean up ... } }

    ViewModel을 생성하기 위해서는 ViewModel Provider 객체가 필요하다. 일반적으로 ViewModelProvider의 생성하기 위해 생성자 매개변수로 ViewModelStoreOwnerViewModelProvider.Factory가 필요하다.

    class MainActivity : AppCompatActivity() { private lateinit var viewModel:MainViewModel override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) //ViewModel 인스턴스 생성 viewModel = ViewModelProvider(this, ViewModelProvider.NewInstanceFactory()) .get(MainViewModel::class.java) } }


    성자가 없는 ViewModel을 인스턴스화 하는 경우에만 간단히 NewInstanceFactory 클래스를 사용하고, 그 외에는 직접 ViewModelProvider.Factory를 구현해야 한다.

    ViewModel 주의사항

    • ViewModel내부에 activity, fragment, view에 대한 context를 저장해서는 안된다

    : ViewModel의 Lifecycle은 외부에 존재하기때문에 Memory leak을 발생시키는 직접적인 원인이 될 수 있다.
    다만 Application context를 저장하는 것은 문제가 되지 않는다. Application context전체 앱의 수명주기를 의미하기 때문에 Memory leak에 영향을 주지 않으며 이런 용도를 위해 AndroidViewModel 클래스를 제공합니다.
    AndroidViewModel은 다음과 같이 인스턴화 할 수 있다.

    viewModel = ViewModelProvider(this, ViewModelProvider.AndroidViewModelFactory(application)) .get(MainViewModel::class.java)
    • ViewModel은 기기의 구성이 변경될때만 유지된다.

    : BackButton이나 , 최근목록에서 앱을 종료했을때는 어떠한 처리도 기대할 수 없다.

    References

    'Android' 카테고리의 다른 글

    Android Kotlin Fundamentals - ViewModel(2)  (0) 2021.05.30
    Android Kotlin Fundamentals - ViewModel(1)  (0) 2021.05.29
    Navigation Component(2)  (0) 2021.05.19
    Navigation Component(1)  (0) 2021.05.18
    SurfaceView  (0) 2021.05.13
Designed by Tistory.