以前,我们没有问题显示以下内容 DialogFragment

// Triggered by button click.
private void openFromCloud() {
LoadFromCloudTaskFragment loadFromCloudTaskFragment = new LoadFromCloudTaskFragment();
FragmentManager fm = this.getSupportFragmentManager();
fm.beginTransaction().add(loadFromCloudTaskFragment, "loadFromCloudTaskFragment").commit();
}
Run Code Online (Sandbox Code Playgroud)
但是,如果我们DialogFragment在按下下面的OK按钮后显示相同的内容Intent,则会发生错误.

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;
}
}
Run Code Online (Sandbox Code Playgroud)
这是详细的错误日志
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
Run Code Online (Sandbox Code Playgroud)
我可以通过使用commitAllowingStateLoss而不是来简单地"解决"问题commit.
fm.beginTransaction().add(loadFromCloudTaskFragment, "loadFromCloudTaskFragment").commitAllowingStateLoss();
Run Code Online (Sandbox Code Playgroud)
我真的不明白有关的文档commitAllowingStateLoss.
与commit()类似,但允许在保存活动状态后执行提交.这很危险,因为如果活动需要稍后从其状态恢复,则提交可能会丢失,因此这应该仅用于UI状态可以在用户上意外更改的情况.
这是基于获得异常的建议"IllegalStateException:onSaveInstanceState之后无法执行此操作"
我真的不明白UI状态是否可以在用户上意外更改.?我可以知道使用可能产生的副作用是commitAllowingStateLoss什么?我可以产生这种副作用的任何步骤吗?
我唯一能想到的是一种"竞争条件"事件.
想象一下当设备在您commitAllowingStateLoss()通话之前旋转时的情况.AFAIK,发生以下情况:
onSaveInstanceState()回调(活动存储它的状态,此刻没有片段存在(因为你还没有提交任何东西)commitAllowingStateLoss执行时将片段添加到活动中Activity重新创建,恢复它的状态,当没有添加你的片段时在我看来,它导致难以预测的情况,例如:
java.lang.IllegalStateException: Failure saving state: FragmentB has target not in fragment manager: FragmentA如果你Fragment.setTargetFragment()因任何原因使用无论如何,我对此并不是百分之百确定,但java.lang.IllegalStateException: Can not perform this action after onSaveInstanceState我的应用程序中有很多意外的异常,并试图找到解决方案.
| 归档时间: |
|
| 查看次数: |
4401 次 |
| 最近记录: |