www.yzc261.comjava.lang.IllegalStateException求指导

( www.yzc261.com )

测试同学跑Monkey跑出了这个异常导致的crash,对应的Android版本是Android6.0。
补充:出问题的Activity是使用了ViewPager无限循环展示图片,内容是ImageView,不是Fragment。
但是我的应用中没有用到任何Fragment,任何commit方法。详细Log如下:

java.lang.IllegalStateException: Can not perform this action after onSaveInstanceState
at android.app.FragmentManagerImpl.checkStateLossFragmentManager.java:1438
    at android.app.FragmentManagerImpl.popBackStackImmediateFragmentManager.java:581
    at android.app.Activity.onBackPressedActivity.java:2537
    at android.app.Activity.onKeyUpActivity.java:2511
    at android.view.KeyEvent.dispatchKeyEvent.java:2695
    at android.app.Activity.dispatchKeyEventActivity.java:2764
    at com.android.internal.policy.PhoneWindow$DecorView.dispatchKeyEventPhoneWindow.java:2384
    at android.view.ViewRootImpl$ViewPostImeInputStage.processKeyEventViewRootImpl.java:4687
    at android.view.ViewRootImpl$ViewPostImeInputStage.onProcessViewRootImpl.java:4643
    at android.view.ViewRootImpl$InputStage.deliverViewRootImpl.java:4155
    at android.view.ViewRootImpl$InputStage.onDeliverToNextViewRootImpl.java:4208
    at android.view.ViewRootImpl$InputStage.forwardViewRootImpl.java:4174
    at android.view.ViewRootImpl$AsyncInputStage.forwardViewRootImpl.java:4320
    at android.view.ViewRootImpl$InputStage.applyViewRootImpl.java:4182
    at android.view.ViewRootImpl$AsyncInputStage.applyViewRootImpl.java:4377
    at android.view.ViewRootImpl$InputStage.deliverViewRootImpl.java:4155
    at android.view.ViewRootImpl$InputStage.onDeliverToNextViewRootImpl.java:4208
    at android.view.ViewRootImpl$InputStage.forwardViewRootImpl.java:4174
    at android.view.ViewRootImpl$InputStage.applyViewRootImpl.java:4182
    at android.view.ViewRootImpl$InputStage.deliverViewRootImpl.java:4155
    at android.view.ViewRootImpl$InputStage.onDeliverToNextViewRootImpl.java:4208
    at android.view.ViewRootImpl$InputStage.forwardViewRootImpl.java:4174
    at android.view.ViewRootImpl$AsyncInputStage.forwardViewRootImpl.java:4353
    at android.view.ViewRootImpl$ImeInputStage.onFinishedInputEventViewRootImpl.java:4523
    at android.view.inputmethod.InputMethodManager$PendingEvent.runInputMethodManager.java:2336
    at android.view.inputmethod.InputMethodManager.invokeFinishedInputEventCallbackInputMethodManager.java:1940
    at android.view.inputmethod.InputMethodManager.finishedInputEventInputMethodManager.java:1931
    at android.view.inputmethod.InputMethodManager$ImeInputEventSender.onInputEventFinishedInputMethodManager.java:2313
    at android.view.InputEventSender.dispatchInputEventFinishedInputEventSender.java:141
    at android.os.MessageQueue.nativePollOnceNative Method
    at android.os.MessageQueue.nextMessageQueue.java:328
    at android.os.Looper.loopLooper.java:164
    at android.app.ActivityThread.mainActivityThread.java:5811
    at java.lang.reflect.Method.invokeNative Method
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.runZygoteInit.java:844
    at com.android.internal.os.ZygoteInit.mainZygoteInit.java:734

在StackOverFlow上搜到了类似的问题:http://stackoverflow.com/ques…

StackOverFlow上说要重写onSaveInstaceState方法,去掉super调用,但是我不清楚这样做是否存在负作用,所以希望有经验的人指导一下如何解决这个问题。

我已经找到方法规避该问题,先自问自答一下。

问题原因:在使用了support-v4包中ViewPager的Activity,由于Android系统历史问题,会导致onSaveInstaceState方法调用时机出现不确定性。而onSaveInstaceState方法中会调用FragmentMananger的saveAllState方法。如果这个调用时机出现在onBackPressed方法之前,在onBackPressed方法中会判断是否已经存在saveAllState的行为,如果存在就抛出IllegalStateException。

解决方法:既然知道方法的原因,当然也就有了对应的解决方案。

方案1(也是我采用的方式——重写onBackPressed方法:

@Override
public void onBackPressed {
    finish;
}

方案二参考StackOverFlow上的做法——重写onSaveInstanceState方法:

@Override
protected void onSaveInstanceStateBundle outState {
    //No call for super. Bug on API Level > 11.
}

两种方法各有弊端,建议更清楚该问题的同学来回答一下这个问题,我抛砖引玉了。

(看完/读完)这篇文章有何感想! www.yzc261.com的分享…

发表评论

电子邮件地址不会被公开。 必填项已用*标注