任何副作用,解决"&的onSaveInstanceState后QUOT无法执行此操作;通过使用commitAllowingStateLoss [英] Any side effect to solve "Can not perform this action after onSaveInstanceState" by using commitAllowingStateLoss

查看:307
本文介绍了任何副作用,解决"&的onSaveInstanceState后QUOT无法执行此操作;通过使用commitAllowingStateLoss的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

previously,我们显示没有问题,以下 DialogFragment

Previously, we have no problem displaying the following DialogFragment

// Triggered by button click.
private void openFromCloud() {      
    LoadFromCloudTaskFragment loadFromCloudTaskFragment = new LoadFromCloudTaskFragment();
    FragmentManager fm = this.getSupportFragmentManager();
    fm.beginTransaction().add(loadFromCloudTaskFragment, "loadFromCloudTaskFragment").commit(); 
}

不过,如果我们往往会显示相同的 DialogFragment 后pressing OK键下面的意图 ,会发生错误。

However, if we tend to display the same DialogFragment after pressing OK button on the following Intent, an error will occur.

private void openFromCloud() {      
    startActivityForResult(Utils.getGoogleAccountCredential().newChooseAccountIntent(), REQUEST_ACCOUNT_PICKER);
}

@Override
protected void onActivityResult(final int requestCode, final int resultCode, final Intent data) {
    switch (requestCode) {
    case REQUEST_ACCOUNT_PICKER:
        if (resultCode == RESULT_OK && data != null && data.getExtras() != null) {
            String accountName = data.getStringExtra(AccountManager.KEY_ACCOUNT_NAME);
            if (accountName != null) {
                Utils.getGoogleAccountCredential().setSelectedAccountName(accountName);
                LoadFromCloudTaskFragment loadFromCloudTaskFragment = new LoadFromCloudTaskFragment();
                FragmentManager fm = getSupportFragmentManager();
                fm.beginTransaction().add(loadFromCloudTaskFragment, "loadFromCloudTaskFragment").commit();
            }
        }
    break;
    }
}


下面是详细的错误日志


Here are the detailed error log

FATAL EXCEPTION: main
java.lang.RuntimeException: Failure delivering result ResultInfo{who=null, request=1, result=-1, data=Intent { (has extras) }} to activity {org.yccheok.xxx.gui/org.yccheok.xxx.gui.XXXFragmentActivity}: java.lang.IllegalStateException: Can not perform this action after onSaveInstanceState
    at android.app.ActivityThread.deliverResults(ActivityThread.java:3141)
    at android.app.ActivityThread.handleSendResult(ActivityThread.java:3184)
    at android.app.ActivityThread.access$1100(ActivityThread.java:130)
    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1243)
    at android.os.Handler.dispatchMessage(Handler.java:99)
    at android.os.Looper.loop(Looper.java:137)
    at android.app.ActivityThread.main(ActivityThread.java:4745)
    at java.lang.reflect.Method.invokeNative(Native Method)
    at java.lang.reflect.Method.invoke(Method.java:511)
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:786)
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553)
    at dalvik.system.NativeStart.main(Native Method)
Caused by: java.lang.IllegalStateException: Can not perform this action after onSaveInstanceState
    at android.support.v4.app.FragmentManagerImpl.checkStateLoss(FragmentManager.java:1299)
    at android.support.v4.app.FragmentManagerImpl.enqueueAction(FragmentManager.java:1310)
    at android.support.v4.app.BackStackRecord.commitInternal(BackStackRecord.java:541)
    at android.support.v4.app.BackStackRecord.commit(BackStackRecord.java:525)
    at org.yccheok.xxx.gui.XXXFragmentActivity$1.run(XXXFragmentActivity.java:107)
    at android.app.Activity.runOnUiThread(Activity.java:4591)
    at org.yccheok.xxx.gui.XXXFragmentActivity.onActivityResult(XXXFragmentActivity.java:102)
    at android.app.Activity.dispatchActivityResult(Activity.java:5192)
    at android.app.ActivityThread.deliverResults(ActivityThread.java:3137)
    ... 11 more

我可以简单地用解决问题的 commitAllowingStateLoss 而不是提交

fm.beginTransaction().add(loadFromCloudTaskFragment, "loadFromCloudTaskFragment").commitAllowingStateLoss();

我真的不明白有关的文档 commitAllowingStateLoss

就像提交(),但允许提交一个活动的后执行
  状态保存。因为提交可能会丢失,如果这是危险的
  该活动需要稍后从它的状态恢复,所以这应该
  仅用于其中,它是好的为UI状态改变的情况下
  出乎意料的用户。

Like commit() but allows the commit to be executed after an activity's state is saved. This is dangerous because the commit can be lost if the activity needs to later be restored from its state, so this should only be used for cases where it is okay for the UI state to change unexpectedly on the user.

这是基于从建议<一href=\"http://stackoverflow.com/questions/7469082/getting-exception-illegalstateexception-can-not-perform-this-action-after-onsa\">getting例外&QUOT; IllegalStateException异常:不能及的onSaveInstanceState后QUOT执行此操作;

我真的不明白了吧它是好的,对UI状态的用户意外更改。?我想知道什么是使用可能的副作用 commitAllowingStateLoss ?任何步骤,我会产生这样的副作用?

I don't really get the point it is okay for the UI state to change unexpectedly on the user.? May I know what is the possible side effect for using commitAllowingStateLoss? Any steps I can produce such side effect?

推荐答案

我能想到的唯一的事情,是一种竞争条件的事件。

The only thing I can think of, is kind of "race condition" event.

试想一个情况,当设备被只是你的 commitAllowingStateLoss()呼叫前旋转。据我所知,发生以下情况:

Imagine a situation, when device is being rotated just before your commitAllowingStateLoss() call. AFAIK, the following occurs:


  • 的onSaveInstanceState()回调(活性存储其状态的无片段present 的时刻(因为你没有犯什么还)

  • commitAllowingStateLoss 执行添加片段以活动

  • 活动被重建,恢复其状态的时刻,当有添加的没有您的片段

  • onSaveInstanceState() callback(activity store it's state with no fragment present at the moment(since you haven't committed anything yet)
  • commitAllowingStateLoss is executed adding fragment to the activity
  • Activity is recreated, restoring it's state to the moment, when there were no your fragment added

在我看来,这导致很难predictable情况,如:

In my opinion, it cause hardly predictable situations, such as:


  • java.lang.IllegalStateException:失败节能状态:FragmentB有目标不是在片段经理:碎裂如果您正在使用 Fragment.setTargetFragment() 以任何理由

  • 您的片段可以简单地从视图中缺少

  • java.lang.IllegalStateException: Failure saving state: FragmentB has target not in fragment manager: FragmentA if you are using Fragment.setTargetFragment() for any reason
  • your fragment can simply be missing from the view

无论如何,我不是100%肯定这件事,但我有很多意想不到的 java.lang.IllegalStateException的:以后的onSaveInstanceState不能执行此操作例外在我的应用程序,并试图找到解决办法了。

Anyway, I'm not 100% sure about that, but I'm having lots of unexpected java.lang.IllegalStateException: Can not perform this action after onSaveInstanceState exceptions in my app, and trying to find a solution too.

这篇关于任何副作用,解决&QUOT;&的onSaveInstanceState后QUOT无法执行此操作;通过使用commitAllowingStateLoss的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
相关文章
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆