Fragment Or DialogFragment Can not perform this action after onSaveInstanceState

Can not perform this action after onSaveInstanceState异常源码分析 Caused by: java.lang.IllegalStateException: Can not perform this action after onSaveInstanceState 在使用fragment、dialogFragment等控件时可能会遇到以上异常。原因正如抛出的异常所说一样:不能在onSaveInstanceState之后执行该操作。 阅读详情

转载自Fragment Or DialogFragment Can not perform this action after onSaveInstanceState

表现

可会造成app崩溃掉,具体日志如下:

异常如下:

java.lang.IllegalStateException: Can not perform this action after onSaveInstanceState
            at android.app.FragmentManagerImpl.checkStateLoss(FragmentManager.java:1323)
            at android.app.FragmentManagerImpl.enqueueAction(FragmentManager.java:1341)
            at android.app.BackStackRecord.commitInternal(BackStackRecord.java:597)
            at android.app.BackStackRecord.commit(BackStackRecord.java:575)
            at android.app.DialogFragment.show(DialogFragment.java:230)
            at com.github.afeita.net.ext.TipsingNetCallback.onStart(TipsingNetCallback.java:55)
            at com.github.afeita.net.ext.AfeitaNet$3.onStart(AfeitaNet.java:567)
            at com.github.afeita.net.ext.request.CacheRequest.deliverOnStart(CacheRequest.java:260)
            at com.github.afeita.net.ExecutorDelivery$4.run(ExecutorDelivery.java:116)
            at android.os.Handler.handleCallback(Handler.java:733)
            at android.os.Handler.dispatchMessage(Handler.java:95)
            at android.os.Looper.loop(Looper.java:136)
            at android.app.ActivityThread.main(ActivityThread.java:5001)
            at java.lang.reflect.Method.invokeNative(Native Method)
            at java.lang.reflect.Method.invoke(Method.java:515)
            at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:785)
            at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:601)
            at dalvik.system.NativeStart.main(Native Method)
场景

这与不洽当的使用Fragment有关系,其实不光时DialogFragment,Fragment也有的。当:

  • A activity页面中,需要异步通知B activity去更新或do something然后A再do 自己的(A)的something,而这让B do something洽好是切换Fragment的话(此时又回到A中自己在do something),那么就可以出现这个异常。
  • activity页面 某个原因要切换到后台中了,系统调用了onSaveInstanceState,此时之后异步任务来了,是需要show或dismiss一个DialogFragment也会报这个异常。

总之是:在onSaveInstanceState后执行了commit抛出的。

原因

上面的异常,跟踪上去是DialogFragment.show方法中报出来,好么查看下源码,这个show里用做什么,抛出这个异常的呢。

public void show(FragmentManager manager, String tag) {
        mDismissed = false;
        mShownByMe = true;
        FragmentTransaction ft = manager.beginTransaction();
        ft.add(this, tag);
        ft.commit(); //注意这里使用提commit
    }
解决方法:

对于肯定会出现这种需求的,比如网络请求访问弹出的加载中…提示DialogFragment。
那么,不采用系统默认的show方法 显示对话框。采用自己用 FragmentTransaction控制,示例如下:

FragmentTransaction ft = activity.getFragmentManager().beginTransaction();
                ft.add(dialogFragment, this.getClass().getSimpleName());
                ft.commitAllowingStateLoss();//注意这里使用commitAllowingStateLoss()

根据google对ft.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.
这个方法是允许activity在state状态改变保存(onSaveInstanceState) 时允许commit。。。但也许不是很洽当,因为当activity onRestoreInstanceState恢复状态时commit可能会被丢掉了。恢复不了那次的commit了。使用这个方法应该确保存页面状态的改变对用户无感时。一般可以确认是即使页面需要重新onRestoreInstanceState时上次commit丢失的也不用管时就可以用了。

注意前面虽然说的是DialogFragment,也是Fragment因为这点并不是DialogFrament特例它属于Fragment不能在onSaveInstanceState,普通的commit。

若DialogFragment使用了ft.commitAllowingStateLoss,那么在关闭时使用dialogFragment.dismissAllowingStateLoss。

ESP32-IDF HTTP服务器实战:从零搭建Web控制界面 本文详细介绍了如何在ESP32平台上使用ESP-IDF框架从零搭建HTTP服务器,并创建Web控制界面。内容涵盖环境配置、服务器基础设置、Web页面处理、GPIO控制接口实现及AJAX异步请求处理,帮助开发者快速掌握物联网设备Web控制开发。 阅读详情

相关推荐

用LangFuse+LangChain打造可观测的AI应用:从埋点到成本监控实战

本文详细介绍了如何将开源可观测性平台LangFuse深度集成到基于LangChain构建的AI应用中,特别是电商客服机器人场景。通过从基础SDK集成、提示词管理到成本监控的完整实战,帮助开发者实现对LLM应用内部工作流的清晰追踪、问题排查与费用分析,从而打造稳定、可控的生产级AI应用。

dapp9builder的博客 711

完美解决DialogFragment Can not perform this action after onSaveInstanceState 问题

完美解决DialogFragment Can not perform this action after onSaveInstanceState 问题 问题解析 参考一下掘金一位大佬的解释让你不再俱怕 Fragment State Loss 简单的来说,就是dialogFragment所依赖的Fragment/FragmentActivity,在***onSaveInstance***之后,会调用dialogFragment的saveAllState,使得fragmennt的成员变量mStateSaved

lzf_acraftsman的博客 8968

从零到一:AIGC+Unity3D打造动态天空盒的实战指南

本文详细介绍了如何利用AIGC技术结合Unity3D打造动态天空盒的实战指南。通过AIGC生成360全景图,再集成到Unity3D中,实现高效、多样化的天空盒效果。文章涵盖了从AIGC全景图生成、工作流搭建到Unity场景集成的完整流程,并提供了代码示例和优化建议,帮助开发者快速掌握这一技术。

weixin_29021291的博客 603

DialogFragment.show()时报错:Can not perform this action after onSaveInstanceState

DialogFragment.show()时报错:Can not perform this action after onSaveInstanceState

尛码渣的专栏 1269

构建企业级AI税务顾问:优化税收策略与合规

本文深入探讨了构建企业级AI税务顾问的重要性及其在实际应用中的价值。通过分析当前税务领域的挑战和问题,本文详细介绍了AI税务顾问的基本原理、技术架构、核心功能以及实践应用。文章以逐步分析的方式,从背景介绍、核心概念与联系、算法原理讲解、系统分析与架构设计、项目实战到最佳实践与展望,系统性地展示了如何利用AI技术优化税收策略并确保税务合规。文章旨在为企业和税务从业者提供实用的指导,推动AI在税务领域的创新与发展。在当前全球经济一体化的背景下,企业面临着越来越复杂的税务环境。首先,税收法规的复杂性日益增加。

AI天才研究院 1156

Cesium 实现动态加载气象数据:渲染成动态雨雪/云层效果(源码 + 原理)

本文介绍了在Cesium中实现动态天气效果的技术方案。核心思路是通过时间轴驱动多层数据动态切换,包括:1)时间维度处理,按序列加载不同气象图层;2)空间维度处理,将气象数据切分为瓦片;3)效果层实现,制作风场、降水等动态可视化效果。文章详细讲解了后端数据预处理(生成瓦片和风场JSON)、前端实现(双层雷达瓦片交替渐变、风场粒子系统)的具体方法,并提供了完整的代码示例。此外还探讨了雨雪粒子、云层效果等增强功能,以及工程化建议,为构建科学准确的动态天气可视化系统提供了实用解决方案。

专注AI大模型,软件混淆,授权 623

自定义DialogFragment出现IllegalStateException: Can not perform this action after onSaveInstanceState异常

之前在项目开发中遇到使用自定义的DialogFragment的时候,出现IllegalStateException: Can not perform this action after onSaveInstanceState的异常,搜了一下网上的帖子,大概意思是: onSaveInstanceState 这个方法会在activity 将要被kill之前被调用以保存每个实...

fengchengwu2012的博客 1万+

基于非接触式微波雷达设计的跌倒检测预警系统【短信报警】

本项目选择基于非接触式微波雷达的跌倒检测预警装置作为技术核心,采用云帆瑞达的R60AFD1跌倒检测模组。这一模组能够根据人体的运动变化,如速度、距离和姿态等特征,判断是否发生跌倒,并可以持续监控老年人是否处于危险状态。此外,本项目还结合4G通信技术,通过Air724UG模块实现短信报警功能,一旦检测到跌倒事故,系统将自动通过4G网络向紧急联系人发送短信报警,及时通知亲属或医护人员进行救援。

1755

Android Bugs——DialogFragment.showNow:Can not perform this action after onSaveInstanceState

那么DialogFragment的show方法是否也可以按照此思路去修改呢,答案是肯定的。在 Activity 被销毁之前被调用来保存每个实例的状态,这样就可以保证该状态能够从。activity的onSaveInstanceState方法中会调用。,所以报错原因就不言而喻了,那么下面说下解决方案。我们都知道Fragment的事务提交有两个方法。方法,来进行Fragment的状态保存,这两种情况都是在存储状态后调用了。,用来标识状态已被保存过。好,下面回到我们报错的地方。等方法,这些方法会调用。

小欣儿的专栏 1483

HQChart实战教程19 - PC端分时图定制tooltip

HQChart实战教程19 - PC端分时图定制tooltip序效果步骤1. 创建一个外部tooltip的div2. 注册标题绘制事件3. 标题绘制回调函数格式说明eventdataobjtooltip显示函数HQChart代码地址 序 hqchart分时图是不带tooltip, 如果我们需要在PC端页面显示tooltip,我们可以通过注册绘制标题事件,来自己做一个div显示数据。 参考教程HQChart实战教程7-自定义显示手势点击K线显示信息 效果 步骤 1. 创建一个外部tooltip的div 在外

小银 2447

十三种通信接口芯片——《器件手册--通信接口芯片》

通信接口芯片用于实现差分信号的传输,具有抗干扰能力强、传输距离远等优点。RS485支持多点通信,可连接多个收发器,而RS422支持单向多点通信。广泛应用于工业自动化、过程控制、仪器仪表、楼宇自动化(如暖通空调、保安系统)、电机控制等领域。ST3485EBDRTP8485ESR用于实现串行通信,支持点对点通信,传输距离相对较短,数据速率较低。常用于计算机与外设(如打印机、调制解调器)之间的通信。如芯力特的SIT3232,可作为ST3232的替代品。

XU157303764的博客 4273

DialogFragment - Can not perform this action after onSaveInstanceState

场景1 使用FragmentTransition的 commit方法添加一个Fragment的时候出现 场景2 使用DialogFragment的show方法时出现 问题原因 onSaveInstanceState方法是在该Activity即将被销毁前调用,来保存Activity数据的,如果在保存玩状态后再给它添加Fragment就会出错。 解决1 就是把

u012987382的博客 537

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

fragment/dialogfragment异常:Can not perform this action after onSaveInstanceState

fragment异常:Can not perform this action after onSaveInstanceState项目在测试的时候未出现崩溃,但是上线之后奔溃日志中发现有相当数量的报错信息如下: java.lang.IllegalStateException: Can not perform this action after onSaveInstanceState at androi

qq_35598366的博客 3688

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

Can not perform this action after onSaveInstanceState 问题的原因与解决

我出现这个问题的原因就是,在当前Acitivity 操作的过程中 跳到另外一个界面做了一些操作然后返回并带了一些参数,再在当前Activity 显示DialogFrament 展示带过来的参数,此时崩溃出现了这个错误信息 IllegalStateException: Can not perform this action after onSaveInstanceState 出现这个问题的原因大致就是在当前Activity 操作的过程中,跳转到其它视图做了一些操作,此时当前Activity运行了onS.

hnzkxlw的专栏 5366

java.lang.IllegalStateException: Can not perform this action after onSaveInstanceState

不加addToBackStack(): new onAttach() -> new onCreate() -> old onPause()-> old onStop()-> old onDestroyView()-> old onDestroy()-> old onDetach() -> new onCreateView() -> new onActivityCreated() -> new onStart()。该异常出现的原因是:commit()在onSaveInstanceState()后调用。

冯旭的博客 2310

解决IllegalStateException: Can not perform this action after onSaveInstanceState

本文出自: http://blog.youkuaiyun.com/ranxiedao/article/details/8214936 今天使用Fragment的时候,出现了这个错误 IllegalStateException: Can not perform this action after onSaveInstanceState: E/AndroidRuntime(1

Felblade 1807

Can not perform this action after onSaveInstanceState

在Android开发中,遇到如下异常: Process: com.xxx, PID: 28227 java.lang.RuntimeException: Failure delivering result ResultInfo{who=@android:requestPermissions:, request=88, result=-1, data=Intent { act=android.content.pm.action.REQUEST_PERMISSIONS (has extras) }} to

ljt2724960661的博客 798

dialogFragment显示是报错Can not perform this action after onSaveInstanceState的解决方案

在某些时候,我们需要在某个页面关闭的同时在新的页面弹出一个弹窗。但如果我们使用的弹窗是DialogFragment,那么很可能就会发现并不能弹出弹窗来,观察日志后发现出现了异常:Can not perform this action after onSaveInstanceState。

简单技术记录总结栈 439

DialogFragment 使用时出现IllegalStateException: Can not perform this action after onSaveInstanceState

今天收到一个问题,检索日志后,看到了如下的错误提示: AndroidRuntime: java.lang.IllegalStateException: Can not perform this action after onSaveInstanceState AndroidRuntime: at android.support.v4.app.FragmentManagerImpl.c...

mahongy的博客 809

java.lang.IllegalStateException Can not perform this action after onSaveInstanceState 解决方案

java.lang.IllegalStateException Can not perform this action after onSaveInstanceState 解决方案 Fragment 闪退复现 Handler().postDelayed({ //打开页面后在 5 秒内按 home 或 back val fragment = Fragment() supportFragmentManager.beginTransaction() .replace(R.id

louisgeek的专栏 4189

Fragment Can not perform this action after onSaveInstanceState

更多博客 https://70kg.info最近遇到了这个异常,记录一下解决办法。首先看一下这个异常是从哪里抛出来的://FragmentManager public void enqueueAction(OpGenerator action, boolean allowStateLoss) { if (!allowStateLoss) { checkSta

Mr_Wrong1的专栏 545
上一篇: 历时四年,给Google提交的Android Framework Bug终于被Fixed了
下一篇: Android应用开发—Application
voidreturn
博客等级 码龄10年 53粉丝 45原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值