IllegalStateException
: 메서드가 불법적이거나 부적절한 시간에 호출되었음을 알립니다.
java.lang.IllegalStateException: Can not perform this action after onSaveInstanceState
재현 경로:
Fragment의 onStop()에서 transacntion을 실행했을 때 위와 같은 Runtime Error가 발생이 된다.
원인:
onSaveInstanceState()이 호출된 이후에 Fragment 전환이 발생한다면, onSaveInstanceState()을 통해 결정되는 복구 시점과 다르기에 해당 FragmentTransaction에 대해서는 복구할 수 없게 돼버립니다. 만약 이런 상황이 발생한다면 사용자 경험(UX)을 해치는 결과를 초래하고, 안드로이드는 이를 방지하고자 IllegalStateException을 던져버립니다.
대책:
가장 간단한 방법은 commit() 대신 commitAllowingStateLoss()를 사용하는 것이다.
transaction.replace(R.id.fragment_view, someFragment()); transaction.commit(); => transaction.commitAllowingStateLoss(); |
하지만, commitAllowingStateLoss() 메서드 정의를 보면, Commit과 비슷하지만, 액티비티의 상태가 저장된 후 Commit를 실행할 수 있으므로 나중에 액티비티의 상태로부터 복원할 경우 commit이 손실될 수 있어서 위험하다고 합니다.
Like commit but allows the commit to be executed after an activity's state is saved. This is dangerous because the commit can be lost if the activity needs to later be restored from its state, so this should only be used for cases where it is okay for the UI state to change unexpectedly on the user. public abstract int commitAllowingStateLoss(); |
가장 좋은 해결책은 액티비티의 상태가 저장되기 전에 Transaction commit을 수행하는 것이라는 겁니다.
'Programming 개발은 구글로 > JAVA[Android]' 카테고리의 다른 글
[안드로이드] Android 개요 (0) | 2022.04.13 |
---|---|
[안드로이드] 4대 컴포넌트 : 액티비티, 서비스, 콘텐츠 프로바이더, 브로드캐스트 리시버 (0) | 2022.04.13 |
[안드로이드][활용] Instagram oEmbed API (2) | 2022.04.12 |
[안드로이드] NestedScrollView (0) | 2022.04.11 |
[안드로이드] ButterKnife Library에 대하여 (0) | 2022.04.11 |
댓글