Fragment를 이용하여 화면 레이아웃을 구성하여 개발하는 경우
어플을 동작중에 다음과 같은 에러와 함께 어플이 종료된다면 해결방법은 간단합니다
Fatal Exception: java.lang.IllegalStateException
Can not perform this action after onSaveInstanceState
해당 에러는 Fragment가 앱에서 전환되면서 발생하는 에러로
기본적으로 Fragment에서 사용되는 transaction.commit() 부분에서 발생됩니다
어느 부분에 문제가 생기는지 추적해 보았더니 안드로이드 Application Activity의
onSaveInstanceState 함수가 호출된 후에 FragmentTransaction의 Commit 함수가
동작하는 순간에 문제가 발생합니다
여기서 안드로이드 시스템은 메모리를 비우기 위해서 Activity, Service 등을 종료할 절대 권한을 가지고 있습니다
onSaveInstanceState 함수는 Activity에 현재 상태를 저장합니다
이 함수를 통해서 Bundle 형태로 자신의 정보를 시스템 프로세스로 보내서 저장하고 있다가
시스템이 Activity를 다시 생성할 때 복구하는 용도로 사용되는데,
바로 Bundle 형태로 저장된 정보가 onSaveInstanceState 함수가 호출된 시점의 스냅샷같은 존재이기 때문입니다
즉 onSaveInstanceState 함수가 호출된 이후 Fragment 전환이 발생한다면 onSaveInstanceState 함수를 통해서
저장되는 시점과 다르기 때문에 FragmentTransaction에 대해서는 복구할 수 없습니다
결국 이런 상황에 대해 안드로이드 시스템은 IllegalStateException 를 발생시킵니다
해당 에러는 Transaction의 commit 함수를 사용하지 않고
commitAllowingStateLoss 함수를 사용함으로써 쉽게 해결할 수 있습니다
해당 함수는 Activity State Loss 현상에 대해 무시하겠다는 의미로
복구 시점에 상태 손실이 발생하더라도 상관없을 때 사용하지만 안드로이드 시스템에서 권장하는 방식은 아닙니다
'안드로이드' 카테고리의 다른 글
[Android] Aborting build since new baseline file was created 에러 해결 (0) | 2023.02.13 |
---|---|
[Android] Lint found fatal errors while assembling a release target. 에러 해결 (0) | 2023.02.13 |
[Android] inputstream StreamCorruptedException 에러 해결 (0) | 2023.01.18 |
[Android] ListView 스크롤 맨 아래로 이동 (1) | 2023.01.16 |
[Android] AndroidStudio 주석 단축키 안될때 (Ctrl+/) (0) | 2023.01.03 |
댓글