일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
- 안드로이드 Sunflower 스터디
- 안드로이드 sunflower
- 프로그래머스 알고리즘
- 막내의 막무가내
- 막내의 막무가내 알고리즘
- 막내의막무가내 rxjava
- 막내의막무가내 플러터
- Fragment
- 프래그먼트
- 막내의막무가내 프로그래밍
- 막내의막무가내 안드로이드 에러 해결
- 막내의막무가내 목표 및 회고
- 막내의막무가내 코틀린 안드로이드
- 막내의막무가내 일상
- 막내의막무가내
- 부스트코스에이스
- 막내의막무가내 안드로이드
- 안드로이드
- 막무가내
- 2022년 6월 일상
- flutter network call
- 주택가 잠실새내
- 주엽역 생활맥주
- 막내의막무가내 안드로이드 코틀린
- 막내의막무가내 코볼 COBOL
- 막내의막무가내 SQL
- 막내의막무가내 알고리즘
- 부스트코스
- 막내의막무가내 플러터 flutter
- 막내의막무가내 코틀린
- Today
- Total
막내의 막무가내 프로그래밍 & 일상
[안드로이드] ViewModel 에서 context 필요로 할 때 해결방법 본문
[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
테스트를 더 쉽게 만드는 추상화이기 때문에 ViewModels에 테스트를 쉽게하기 위해 Android 특정 코드를 포함해서는 안됩니다.
ViewModels에 Context 인스턴스 또는 Context를 보유하는 Views 또는 기타 객체와 같은 객체가 포함되어서는 안되는 이유는 Activities 및 Fragments와 별도의 수명주기가 있기 때문입니다.
이것이 의미하는 바는 앱에서 회전 변경을 수행한다고 가정 해 봅시다. 이로 인해 액티비티와 프래그먼트가 자체적으로 파괴되어 다시 생성됩니다. ViewModel은이 상태 동안 지속되도록하기 때문에 파괴 된 활동에 대한 View 또는 Context를 여전히 보유하고있는 경우 충돌 및 기타 예외가 발생할 수 있습니다.
원하는 작업을 수행하는 방법에 대해 MVVM 및 ViewModel은 JetPack의 데이터 바인딩 구성 요소와 잘 작동합니다. 일반적으로 String, int 등을 저장하는 대부분의 경우 데이터 바인딩을 사용하여 뷰가 직접 표시되도록 할 수 있으므로 ViewModel 내부에 값을 저장할 필요가 없습니다.
그러나 데이터 바인딩을 원하지 않으면 생성자 또는 메서드 내부의 컨텍스트를 전달하여 리소스에 액세스 할 수 있습니다. ViewModel 내에 해당 컨텍스트의 인스턴스를 보유하지 마십시오.
댓글과 공감은 큰 힘이 됩니다. 감사합니다. !!
'안드로이드 > 코틀린 & 아키텍처 & Recent' 카테고리의 다른 글
[안드로이드] 안드로이드 BottomNavigationView icon 설정 해결 (8) | 2020.06.26 |
---|---|
[안드로이드] 안드로이드 카카오톡 로그인 구현 및 MVVM 적용 (feat. SingleLiveEvent) (0) | 2020.06.22 |
[안드로이드] 안드로이드 MVVM + RxJava2 + Koin + Jsoup 정리 (충남대학교 컴퓨터공학과 공지사항 토이 프로젝트) (4) | 2020.06.03 |
[안드로이드] 코틀린 커스텀 다이얼로그 프래그먼트 (Custom Dialog Fragment) (3) | 2020.05.23 |
[안드로이드] Jetpack Bottom Navigation View refactor name 관련 주의할 점 (0) | 2020.05.23 |