任何副作用,解决"&的onSaveInstanceState后QUOT无法执行此操作;通过使用commitAllowingStateLoss [英] Any side effect to solve "Can not perform this action after onSaveInstanceState" by using 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 activityActivity
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 usingFragment.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屋!