본문 바로가기
안드로이드

[Android] IllegalStateException 에러 해결

by 코딩히어로 2023. 1. 19.
728x90

1


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 현상에 대해 무시하겠다는 의미로

복구 시점에 상태 손실이 발생하더라도 상관없을 때 사용하지만 안드로이드 시스템에서 권장하는 방식은 아닙니다

 

728x90
반응형

댓글