Notice
Recent Posts
Recent Comments
Link
«   2025/01   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
Tags
more
Archives
Today
Total
관리 메뉴

Wook No.1

[에러] Fatal Exception: java.lang.IllegalStateException Can not perform this action after onSaveInstanceState 본문

Android

[에러] Fatal Exception: java.lang.IllegalStateException Can not perform this action after onSaveInstanceState

Wook No.1 2022. 7. 4. 13:48

Fragment 전환 시 Exception 원인

Fatal Exception: java.lang.IllegalStateException

Can not perform this action after onSaveInstanceState

onSaveInstanceState 함수가 호출된 상태에서 Fragment commit 함수를 호출 했을 때 발생 하는데 onSaveInstanceStateActivity 에게 현재 상태를 Bundle 형태로 저장 시킬수 있는 함수다.

 

onSaveInstanceState 함수가 호출된 이후에 Fragment 전환이 발생한다면, onSaveInstanceState 함수를 통해 결정되는 복구 시점과 다르기에 해당 FragmentTransaction에 대해서는 복구할 수 없게 된다. 

만약 이런 상황이 발생한다면 사용자 경험(UX)을 해치는 결과를 초래하고, 안드로이드는 이를 방지하고자 IllegalStateException을 발생시킨다.

 

해결 방안

1. 비동기 처리할때는 Transaction commit을 하지 않도록 한다. 그리고 Activity 상태를 저장하는 onSaveInstanceState 함수가 호출되기 전이 보장되는 곳에서 commit을 수행한다.

 

2. Transaction의 commit  대신 commitAllowingStateLoss 함수를 사용

(복구 시점에서 상태 손실이 발생하더라도 괜찮을 때 사용하면 되지만 권장하는 방법은 아니다)

supportFragmentManager
    .beginTransaction()
    .replace(R.id.container, fragment)
    .commitAllowingStateLoss()

 

혹시 DialogFragment.show를 사용 사용할때는 아래와 같이 수정하면 된다.

supportFragmentManager
    .beginTransaction()
    .add(dialogFragment, dialogFragment.tag)
    .commitAllowingStateLoss()
Comments