1. 요약
2. viewModel
2-1. 개념
2-2. viewModel은 언제 파괴될까?
1. 요약
🧑💻: Activity의 onDestroy가 호출되면 viewModel의 onCleared가 호출된다고 하셨는데
그러면 화면을 회전할 때 왜 viewModel의 onCleared가 호출되지 않을까요?
👨🏻🦱: if문으로 화면을 회전하는 경우를 따로 처리해주었기 때문입니다.
코드 내부를 들여다보면 알 수 있습니다.
2. viewModel
2-1. 개념
viewModel에 대해서는 예전에 자세히 정리해둔 포스팅이 있다.
요약하자면 "viewModel은 Activity와 독립적인 생명주기를 가지기 때문에
Activity가 onDestory 되어도 데이터를 유지할 수 있게 해준다"이다.
2-2. onDestroy 호출에도 viewModel이 파괴되지 않는 이유
viewModel은 언제 파괴되느냐?
Activtiy가 onDestroy 되고 난 이후에 onCleared 된다.
그렇다면 여기서 의문점이 발생한다.
화면을 회전하면 onDestroy -> onCreate 순서로 실행이 되는데
그때 왜 viewModel은 파괴되지 않지?
onDestory가 호출된 후에 onCleared가 실행된다며?? 🤔
getLifecycle().addObserver(new LifecycleEventObserver() {
@Override
public void onStateChanged(@NonNull LifecycleOwner source,
@NonNull Lifecycle.Event event) {
if (event == Lifecycle.Event.ON_DESTROY) {
// Clear out the available context
mContextAwareHelper.clearAvailableContext();
// And clear the ViewModelStore
if (!isChangingConfigurations()) { // <- 이거 덕분에 화면 회전시 아래 코드가 실행안됨
getViewModelStore().clear(); // <- 이게 호출되어야 viewModel이 파괴됨
}
}
}
});
이에 대한 해결책은 AppCompatActivity - FragmentActivity - ComponentActivity 안에 있는 코드에서 찾을 수 있다.
9번째 줄의 if문을 보면 isChangingConfigurations() 메서드가 보이는데
public boolean isChangingConfigurations() {
return mChangingConfigurations;
}
이렇게 생겼고 저 리턴 값의 주석은 다음과 같다.
true if the activity is being destoryed in order to recreate it with a new configuration
즉, 새로운 배치를 위해서(= 화면 회전을 위해서) activity를 파괴했다가 다시 만드는 경우 이 값은 true라는 것이다.
그러니까!
액티비티 다시 만드려고 파괴하는 거면 onCleared 호출 안됨!
저 if문에서 걸러짐!
오늘의 공부는 라이트 하게 여기서 끝~
💡 느낀 점
- 면접에서 이 질문받았는데 잘 몰라서 "어... onDestory 될 때 특정 조건에 따라 onCleared가 호출되는 것 같습니다.."라고 했는데 얼떨결에 맞춰서 다행이다. 앞으로는 더 잘 대답할 수 있을 듯
- 생각보다 굉장히 단순한 이유였구나...
- 안드로이드 공식문서에서 이 이유도 알려줬으면 좋았으려만...
📘 참고한 자료
반응형
'오늘은 뭘 배울까? > Android' 카테고리의 다른 글
suspend 함수란 무엇인가요? (0) | 2022.08.29 |
---|---|
코루틴은 왜 빠른 걸까요? (0) | 2022.08.27 |
Kotlin 확장 함수(Extension Function)를 아시나요? (2) | 2022.07.16 |
Delegation이 무엇인지 아시나요? (상속과 구성까지 알아보자) (4) | 2022.07.11 |
Observable Field와 LiveData의 차이가 무엇인가요? (0) | 2022.07.09 |
댓글