Fragment에서 다른 Fragment로 이동시 아래와 같은 코드를 사용한다,
1 2 3 4 5 6 7 8 9 10 11 | TestFragment fragment = TestFragment.newInstance(status, info); FragmentManager fragmentManager = getFragmentManager(); if (fragmentManager == null) { return; } FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction(); fragmentTransaction.replace(R.id.fragmentContainer, fragment, TestFragment.TAG); fragmentTransaction.addToBackStack(null); fragmentTransaction.commit(); | cs |
그런데 이 때 아래와 같은 Exception을 볼 수 있는 경우가 있다.
1 2 3 4 | /** Error **/ E/UncaughtException: java.lang.IllegalStateException: Can not perform this action after onSaveInstanceState | cs |
아래가 바로 그 경우를 상세히 작성한 것이다.
Activity(A)에서 화면을 전환하기 전에 onSaveInstanceState를 호출하게 된다.
그러고 다음 Activity(B)를 띄우고 다시 Activity(B)를 닫으면
Activity(A)가 onRestart가 작동하고 그 어떤 Activity를 열려고 할 때
IllegalStateException과 함께 Crash가 발동(?)한다.
원인은 onSaveInstanceState에 있다고 보면 된다.
Error에 작성된 것처럼 onSaveInstanceState를 부른 뒤에 commit 실행을 할 수 없다는 것.
이 것은 Activity State Loss 현상으로 보면 된다.
onCreate가 작동할 때 Activity State를 전달하기 때문이다.
자세한건 출저의 글을 읽어보자.
나의 경우 Activity State Loss 현상은 Asynchronous의 callback에 있었다.
사용할 때 꺼림칙하긴 했는데 실제로 이럴줄이야.
callback에서 보통 transaction을 commit하지 않는다고 한다. (이런...)
그래서 Loss를 허용하는 commitAllowingStateLoss를 사용했다.
1 | fragmentTransaction.commitAllowingStateLoss(); | cs |
물론 제일 좋은 것은 Activity의 상태가 저장되기 전에 commit을 사용하는 것이지만
그것이 어려울 경우 위와 같이 사용하면 된다.
'Android, iOS' 카테고리의 다른 글
Toolbar를 만들었는데 Statusbar가 가리고 있다면?? (0) | 2018.06.07 |
---|---|
intent.addFlags로 자주 쓰는 상수 세트 (0) | 2018.05.31 |
Intent로도 data를 넘기기 어려울 땐? ResultReceiver (0) | 2018.03.28 |
EditText로인해 키보드가 나타나는 것을 막으려면? (0) | 2018.03.22 |
여러분, Volley라고 들어봤어요? (젠장) (0) | 2018.01.18 |
Comment