android – 使用commitAllowingStateLoss解决“无法在onSaveInstanceState之后执行此 *** 作”的任何副作用

android – 使用commitAllowingStateLoss解决“无法在onSaveInstanceState之后执行此 *** 作”的任何副作用,第1张

概述以前,我们在显示以下DialogFragment时没有问题 // Triggered by button click.private void openFromCloud() { LoadFromCloudTaskFragment loadFromCloudTaskFragment = new LoadFromCloudTaskFragment(); Fragment 以前,我们在显示以下DialogFragment时没有问题

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

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

private voID openFromCloud() {          startActivityForResult(Utils.getGoogleAccountCredential().newChooseAccountIntent(),REQUEST_ACCOUNT_PICKER);}@OverrIDeprotected 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: mainjava.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.access00(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.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()回调(活动存储它的状态,此刻没有片段存在(因为你还没有提交任何东西)
>执行commitAllowingStateLoss将片段添加到活动中
>重新创建活动,将状态恢复到当前没有添加任何碎片的状态

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

> java.lang.IllegalStateException:失败保存状态:如果您因任何原因使用Fragment.setTargetFragment(),FragmentB的目标不在片段管理器中:FragmentA
>您的片段可能只是从视图中丢失

无论如何,我对此并不是百分之百确定,但是我有很多意外的java.lang.IllegalStateException:在我的应用程序中的onSaveInstanceState异常之后无法执行此 *** 作,并且也试图找到解决方案.

总结

以上是内存溢出为你收集整理的android – 使用commitAllowingStateLoss解决“无法在onSaveInstanceState之后执行此 *** 作”的任何副作用全部内容,希望文章能够帮你解决android – 使用commitAllowingStateLoss解决“无法在onSaveInstanceState之后执行此 *** 作”的任何副作用所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/web/1122002.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-29
下一篇 2022-05-29

发表评论

登录后才能评论

评论列表(0条)

保存