화면 전환할 때 IllegalStateException이 나타난다면? commitAllowingStateLoss
728x90
반응형

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가 발동(?)한다.

참조 : http://www.kmshack.kr/http://gogorchg.tistory.com/


원인은 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을 사용하는 것이지만

그것이 어려울 경우 위와 같이 사용하면 된다.



728x90
반응형