티스토리 뷰

반응형

Stack Overflow에 자주 검색, 등록되는 문제들과 제가 개발 중 찾아 본 문제들 중에서 나중에도 찾아 볼 것 같은 문제들을 정리하고 있습니다.

Stack Overflow에서 가장 먼저 확인하게 되는 가장 높은 점수를 받은 Solution과 현 시점에 도움이 될 수 있는 가장 최근에 업데이트(최소 점수 확보)된 Solution을 각각 정리하였습니다.

 

아래 word cloud를 통해 이번 포스팅의 주요 키워드를 미리 확인하세요.

IllegalStateException: Can not perform this action after onSaveInstanceState with ViewPager

IllegalStateException: ViewPager에서 onSaveInstanceState 이후에 이 작업을 수행할 수 없습니다.

 문제 내용 

I'm getting user reports from my app in the market, delivering the following exception:

저는 앱 마켓에서 사용자로부터 다음 예외를 전달받고 있습니다.
java.lang.IllegalStateException: Can not perform this action after onSaveInstanceState
at android.app.FragmentManagerImpl.checkStateLoss(FragmentManager.java:1109)
at android.app.FragmentManagerImpl.popBackStackImmediate(FragmentManager.java:399)
at android.app.Activity.onBackPressed(Activity.java:2066)
at android.app.Activity.onKeyUp(Activity.java:2044)
at android.view.KeyEvent.dispatch(KeyEvent.java:2529)
at android.app.Activity.dispatchKeyEvent(Activity.java:2274)
at com.android.internal.policy.impl.PhoneWindow$DecorView.dispatchKeyEvent(PhoneWindow.java:1803)
at android.view.ViewGroup.dispatchKeyEvent(ViewGroup.java:1112)
at android.view.ViewGroup.dispatchKeyEvent(ViewGroup.java:1112)
at android.view.ViewGroup.dispatchKeyEvent(ViewGroup.java:1112)
at com.android.internal.policy.impl.PhoneWindow$DecorView.superDispatchKeyEvent(PhoneWindow.java:1855)
at com.android.internal.policy.impl.PhoneWindow.superDispatchKeyEvent(PhoneWindow.java:1277)
at android.app.Activity.dispatchKeyEvent(Activity.java:2269)
at com.android.internal.policy.impl.PhoneWindow$DecorView.dispatchKeyEvent(PhoneWindow.java:1803)
at android.view.ViewGroup.dispatchKeyEvent(ViewGroup.java:1112)
at android.view.ViewGroup.dispatchKeyEvent(ViewGroup.java:1112)
at android.view.ViewGroup.dispatchKeyEvent(ViewGroup.java:1112)
at android.view.ViewGroup.dispatchKeyEvent(ViewGroup.java:1112)
at android.widget.TabHost.dispatchKeyEvent(TabHost.java:297)
at android.view.ViewGroup.dispatchKeyEvent(ViewGroup.java:1112)
at android.view.ViewGroup.dispatchKeyEvent(ViewGroup.java:1112)
at android.view.ViewGroup.dispatchKeyEvent(ViewGroup.java:1112)
at com.android.internal.policy.impl.PhoneWindow$DecorView.superDispatchKeyEvent(PhoneWindow.java:1855)
at com.android.internal.policy.impl.PhoneWindow.superDispatchKeyEvent(PhoneWindow.java:1277)
at android.app.Activity.dispatchKeyEvent(Activity.java:2269)
at com.android.internal.policy.impl.PhoneWindow$DecorView.dispatchKeyEvent(PhoneWindow.java:1803)
at android.view.ViewRoot.deliverKeyEventPostIme(ViewRoot.java:2880)
at android.view.ViewRoot.handleFinishedEvent(ViewRoot.java:2853)
at android.view.ViewRoot.handleMessage(ViewRoot.java:2028)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:132)
at android.app.ActivityThread.main(ActivityThread.java:4028)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:491)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:844)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:602)
at dalvik.system.NativeStart.main(Native Method)

 

Apparently it has something to do with a FragmentManager, which I don't use. The stacktrace doesn't show any of my own classes, so I have no idea where this exception occurs and how to prevent it.

보고된 예외는 FragmentManager와 관련이 있다는 것 같지만, 저는 사용하지 않습니다. 스택트레이스에서는 제 클래스 중 어떤 것도 표시되지 않으므로, 이 예외가 어디에서 발생하는지와 어떻게 방지할 수 있는지 모르겠습니다.

 

For the record: I have a tabhost, and in each tab there is a ActivityGroup switching between Activities.

참고로, 저는 TabHost가 있는데 각 탭에서 ActivityGroup이 있고 ActivityGroup에서 Activity를 전환합니다.

 

 

 

 높은 점수를 받은 Solution 

Please check my answer here. Basically I just had to :

여기에서 제 답변을 확인해 주세요. 기본적으로 제가 해야 할 일은 다음과 같습니다:
@Override
protected void onSaveInstanceState(Bundle outState) {
    //No call for super(). Bug on API Level > 11.
}

 

Don't make the call to super() on the saveInstanceState method. This was messing things up...

saveInstanceState 메서드에서 super() 호출을 하지 마십시오. 이것이 문제를 일으키고 있습니다...

 

This is a known bug in the support package.

이것은 support 패키지의 알려진 버그입니다.

 

If you need to save the instance and add something to your outState Bundle you can use the following:

만약 인스턴스를 저장하고 outState Bundle에 무언가를 추가해야 한다면, 다음을 사용할 수 있습니다:
@Override
protected void onSaveInstanceState(Bundle outState) {
    outState.putString("WORKAROUND_FOR_BUG_19917_KEY", "WORKAROUND_FOR_BUG_19917_VALUE");
    super.onSaveInstanceState(outState);
}

 

In the end the proper solution was (as seen in the comments) to use :

결국 적절한 해결책은 (댓글에서 확인할 수 있는 것처럼) 다음과 같이 사용하는 것이었습니다:
transaction.commitAllowingStateLoss();

 

when adding or performing the FragmentTransaction that was causing the Exception.

예외를 발생시킨 FragmentTransaction을 추가하거나 수행할 때, 해당 문제가 발생합니다.

 

 

 

 가장 최근 달린 Solution 

Fragment transactions should not be executed after Activity.onStop() ! Check that you do not have any callbacks that could execute transaction after onStop(). It is better to fix the reason instead of trying to walk around the problem with approaches like .commitAllowingStateLoss()

Fragment transactions는 Activity.onStop() 이후에 실행되어서는 안 됩니다! onStop() 이후에 transaction을 실행하는 콜백이 없는지 확인하십시오. .commitAllowingStateLoss()와 같은 방법으로 문제를 해결하기보다 원인을 수정하는 것이 좋습니다.

 

 

 

출처 : https://stackoverflow.com/questions/7575921/illegalstateexception-can-not-perform-this-action-after-onsaveinstancestate-wit

반응형
댓글
공지사항
최근에 올라온 글