본문 바로가기
오늘은 뭘 배울까?/Android

화면을 회전할 때 viewModel의 onCleared가 호출되지 않는 이유

by Kim Juhwan 2022. 8. 26.

1. 요약
2. viewModel
   2-1. 개념
   2-2. viewModel은 언제 파괴될까?

 

 

 


 

 

1. 요약

🧑‍💻: Activity의 onDestroy가 호출되면 viewModel의 onCleared가 호출된다고 하셨는데
그러면 화면을 회전할 때 왜 viewModel의 onCleared가 호출되지 않을까요?

 

👨🏻‍🦱: if문으로 화면을 회전하는 경우를 따로 처리해주었기 때문입니다.
코드 내부를 들여다보면 알 수 있습니다.

 

2. viewModel

2-1. 개념

Activity와 ViewModel의 생명주기 비교

 

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가 호출되는 것 같습니다.."라고 했는데 얼떨결에 맞춰서 다행이다. 앞으로는 더 잘 대답할 수 있을 듯
  • 생각보다 굉장히 단순한 이유였구나...
  • 안드로이드 공식문서에서 이 이유도 알려줬으면 좋았으려만...

📘 참고한 자료


 

 

반응형

댓글