하루에 0.01%라도 성장하자

Develop/Android

Fragment Commit, CommitAllowingStateLoss 그리고 재현방법

뚠님 2022. 11. 23. 12:25
반응형

이번에는 Fragment 중 Commit에 관한 내용을 작성한다.

 

서비스 중인 앱에서 아래와 같은 크래쉬 이력이 남았다.

 

Can't access the Fragment View's LifecycleOwner when getView() is null i.e., before onCreateView() or after onDestroyView()

 

원인을 찾아보니 Activity 에서 onSaveInstanceState 가 호출된 후 Fragment 에서 commit 이 동작되서 발생한 문제였다.

 

onSaveInstanceState의 호출 시점은 여기를 참고해 보면 좋겠다!

 

해결 방법으로는 commit 대신에 commitAllowingStateLoss 를 실행해주면 해결된다는 레퍼런스를 쉽게 찾을 수 있었다.

하지만 우선 commitAllowingStateLoss는 Fragment의 상태값을 잃을 수 있는 리스크가 있는데

그렇다면 우리가 운영하는 서비스가 Fragment의 상태값을 잃어도 크게 문제 없는 서비스인지 확인해야 한다.

 

원인은 알았고.. 해결법도 알았는데... 이게 정상적으로 해결이 되었는지 확인하려면 증상 재현을 해야한다.

하지만 이건 간헐적으로 발생하는 문제였고, 특정 상황에서 발생하는 현상이다 보니 재현하기가 쉽지 않았다.

 

이 때 증상 재현을 위해 개발자 모드에서 재공해주는 기능을 사용하였다.

 

설정 -> 개발자 모드 -> 활동유지안함 허용

 

이렇게 하면, 액티비티가 전환되면서 활동유지를 안하기 때문에 매번 화면을 다시 그린다.

이 상태에서 문제가 발생하는 화면에 접근하면 바로 위 에러를 뱉으면서 앱이 죽어버렸다.

 

그리고 commitAllowingStateLoss로 변경 후 다시 실행 했을 때 앱이 죽지 않는 것도 확인했다.

 

순서 정리

1. 개발자 모드에서 활동유지안함 허용

2. commit을 사용하여 앱이 죽는지 확인

3. commitAllowingStateLoss를 사용하여 앱이 안죽는지 확인

4. 개발자 모드에서 활동유지안함 제거

5. commitAllowingStateLoss를 사용했을 때 앱이 정상동작 하는지 확인.

 

 

반응형