관리 메뉴

막내의 막무가내 프로그래밍 & 일상

[안드로이드] ViewModel 에서 context 필요로 할 때 해결방법 본문

안드로이드/코틀린 & 아키텍처 & Recent

[안드로이드] ViewModel 에서 context 필요로 할 때 해결방법

막무가내막내 2020. 6. 22. 03:28
728x90

 

[2021-04-13 업데이트]

 

 

Dagger2, Koin 같은 의존성주입으로 안전하게 application의 context 를 ViewModel 에 넘기는식 말고 VIewModel에서 액티비티나 프래그먼트의 라이프사이클과 충돌이 안나게 context를 필요로 할때가 있습니다. (viewModel 은 액티비티나 프래그먼트의 context를 참조하지 않게 구현하는것을 지향해야합니다.)

 

다음과 같이하면 AndroidViewModel 과 applicatiocontext를 이용해서 사용하면 된다고합니다.

[액티비티의 컨텍스트를 액티비티의 ViewModel에 메모리 누수로 전달하는 것은 좋지 않습니다.

따라서 ViewModel에서 컨텍스트를 얻으려면 ViewModel 클래스가 Android View Model 클래스를 확장해야합니다 . 그렇게하면 아래 예제 코드와 같이 컨텍스트를 얻을 수 있습니다.]

class LoginViewModel(application: Application) : AndroidViewModel(application) {
    private val context = getApplication<Application>().applicationContext

 

다음 스택오버플로우에서 이 관련문제에 대해 살펴볼 수 있습니다.

https://stackoverflow.com/questions/51451819/how-to-get-context-in-android-mvvm-viewmodel

 

How to get Context in Android MVVM ViewModel

I am trying to implement MVVM pattern in my android app. I have read that ViewModels should contain no android specific code (to make testing easier), however I need to use context for various thin...

stackoverflow.com

테스트를 더 쉽게 만드는 추상화이기 때문에 ViewModels에 테스트를 쉽게하기 위해 Android 특정 코드를 포함해서는 안됩니다.

ViewModels에 Context 인스턴스 또는 Context를 보유하는 Views 또는 기타 객체와 같은 객체가 포함되어서는 안되는 이유는 Activities 및 Fragments와 별도의 수명주기가 있기 때문입니다.

이것이 의미하는 바는 앱에서 회전 변경을 수행한다고 가정 해 봅시다. 이로 인해 액티비티와 프래그먼트가 자체적으로 파괴되어 다시 생성됩니다. ViewModel은이 상태 동안 지속되도록하기 때문에 파괴 된 활동에 대한 View 또는 Context를 여전히 보유하고있는 경우 충돌 및 기타 예외가 발생할 수 있습니다.

원하는 작업을 수행하는 방법에 대해 MVVM 및 ViewModel은 JetPack의 데이터 바인딩 구성 요소와 잘 작동합니다. 일반적으로 String, int 등을 저장하는 대부분의 경우 데이터 바인딩을 사용하여 뷰가 직접 표시되도록 할 수 있으므로 ViewModel 내부에 값을 저장할 필요가 없습니다.

그러나 데이터 바인딩을 원하지 않으면 생성자 또는 메서드 내부의 컨텍스트를 전달하여 리소스에 액세스 할 수 있습니다. ViewModel 내에 해당 컨텍스트의 인스턴스를 보유하지 마십시오.

 

 

댓글과 공감은 큰 힘이 됩니다. 감사합니다. !!

 

 

728x90
Comments