gpt4 book ai didi

android - 使用 commitAllowingStateLoss 解决 "Can not perform this action after onSaveInstanceState"的任何副作用

转载 作者:太空宇宙 更新时间:2023-11-03 12:21:16 25 4
gpt4 key购买 nike

之前我们显示下面的DialogFragment

没有问题

enter image description here

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

但是,如果我们倾向于在以下 Intent 上按下 OK 按钮后显示相同的 DialogFragment,则会发生错误。

enter image description here

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;
}
}

这里是详细的错误日志

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 而不是 commit 来简单地“解决”问题。

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

我不太理解有关 commitAllowingStateLoss 的文档。

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.

这是基于 getting exception "IllegalStateException: Can not perform this action after onSaveInstanceState" 的建议

我真的不明白UI 状态在用户身上意外改变是可以的。?我可以知道使用 commitAllowingStateLoss 可能产生的副作用是什么吗?有什么步骤可以产生这样的副作用吗?

最佳答案

我唯一能想到的是一种“竞争条件”事件。

想象一种情况,当设备在您的 commitAllowingStateLoss() 之前旋转时称呼。 AFAIK,发生以下情况:

  • onSaveInstanceState()回调( Activity 存储它的状态目前没有 fragment (因为你还没有提交任何东西)
  • commitAllowingStateLoss执行添加 fragment 到 Activity
  • Activity重新创建,将其状态恢复到未添加您的 fragment
  • 时的状态

在我看来,它会导致难以预测的情况,例如:

  • java.lang.IllegalStateException: Failure saving state: FragmentB has target not in fragment manager: FragmentA如果您使用 Fragment.setTargetFragment()出于任何原因
  • 您的 fragment 可能只是从 View 中丢失

无论如何,我不是 100% 确定,但我有很多意想不到的 java.lang.IllegalStateException: Can not perform this action after onSaveInstanceState我的应用程序中出现异常,并试图找到解决方案。

关于android - 使用 commitAllowingStateLoss 解决 "Can not perform this action after onSaveInstanceState"的任何副作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15391129/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com