java.lang.IllegalStateException求指导

发布于 2022-09-04 02:26:48 字数 3481 浏览 22 评论 0

测试同学跑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.checkStateLoss(FragmentManager.java:1438)
    at android.app.FragmentManagerImpl.popBackStackImmediate(FragmentManager.java:581)
    at android.app.Activity.onBackPressed(Activity.java:2537)
    at android.app.Activity.onKeyUp(Activity.java:2511)
    at android.view.KeyEvent.dispatch(KeyEvent.java:2695)
    at android.app.Activity.dispatchKeyEvent(Activity.java:2764)
    at com.android.internal.policy.PhoneWindow$DecorView.dispatchKeyEvent(PhoneWindow.java:2384)
    at android.view.ViewRootImpl$ViewPostImeInputStage.processKeyEvent(ViewRootImpl.java:4687)
    at android.view.ViewRootImpl$ViewPostImeInputStage.onProcess(ViewRootImpl.java:4643)
    at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:4155)
    at android.view.ViewRootImpl$InputStage.onDeliverToNext(ViewRootImpl.java:4208)
    at android.view.ViewRootImpl$InputStage.forward(ViewRootImpl.java:4174)
    at android.view.ViewRootImpl$AsyncInputStage.forward(ViewRootImpl.java:4320)
    at android.view.ViewRootImpl$InputStage.apply(ViewRootImpl.java:4182)
    at android.view.ViewRootImpl$AsyncInputStage.apply(ViewRootImpl.java:4377)
    at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:4155)
    at android.view.ViewRootImpl$InputStage.onDeliverToNext(ViewRootImpl.java:4208)
    at android.view.ViewRootImpl$InputStage.forward(ViewRootImpl.java:4174)
    at android.view.ViewRootImpl$InputStage.apply(ViewRootImpl.java:4182)
    at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:4155)
    at android.view.ViewRootImpl$InputStage.onDeliverToNext(ViewRootImpl.java:4208)
    at android.view.ViewRootImpl$InputStage.forward(ViewRootImpl.java:4174)
    at android.view.ViewRootImpl$AsyncInputStage.forward(ViewRootImpl.java:4353)
    at android.view.ViewRootImpl$ImeInputStage.onFinishedInputEvent(ViewRootImpl.java:4523)
    at android.view.inputmethod.InputMethodManager$PendingEvent.run(InputMethodManager.java:2336)
    at android.view.inputmethod.InputMethodManager.invokeFinishedInputEventCallback(InputMethodManager.java:1940)
    at android.view.inputmethod.InputMethodManager.finishedInputEvent(InputMethodManager.java:1931)
    at android.view.inputmethod.InputMethodManager$ImeInputEventSender.onInputEventFinished(InputMethodManager.java:2313)
    at android.view.InputEventSender.dispatchInputEventFinished(InputEventSender.java:141)
    at android.os.MessageQueue.nativePollOnce(Native Method)
    at android.os.MessageQueue.next(MessageQueue.java:328)
    at android.os.Looper.loop(Looper.java:164)
    at android.app.ActivityThread.main(ActivityThread.java:5811)
    at java.lang.reflect.Method.invoke(Native Method)
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:844)
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:734)

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

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

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

酒废 2022-09-11 02:26:48

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

问题原因:在使用了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 onSaveInstanceState(Bundle outState) {
    //No call for super(). Bug on API Level > 11.
}

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

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文