当前位置: 首页 > news >正文

Firebase崩溃:ViewBinding not init!!

最近新版本上线以后,firebase上出现了比较多的崩溃,崩溃日志如下:
在这里插入图片描述

页面结构是Activity中添加Fragment,Activity和Fragment都使用了ViewBinding。复现步骤是在切换系统语言以后,再回到界面调用一个方法,方法中使用了ViewBinding对象。
因为切换系统语言以后,Fragment走了onDestroy和onDestroyView方法,Fragment被销毁了。Activity中是持有对应的Fragment实例的,这会出现问题。

setRetainInstance

Fragment提供了setRetainInstance方法,在设置为true的时候,是不会被销毁的,因此开始想到的就是这种方式。但是这种方式会出现问题,就是Fragment的生命周期会出现变化。而且官方也弃用setRetainInstance了,具体原因是:

  • 内存泄漏:保留的 Fragments 保存了对旧 Activity 的引用,如果处理不当可能会导致内存泄漏
  • 困惑的状态管理:复杂的状态交互可能会导致意外行为和视图生命周期问题
  • 紧密耦合:使用保留片段可能会导致视图层与数据和操作紧密耦合,从而使代码更难维护

官方建议:ViewModel是配置更改时保留状态的主要解决方案。ViewModel的设计具有生命周期感知功能,使其成为保存UI状态数据和在 Activity 重新创建后继续使用的较优方式

经过综合考虑,最终放弃了这种方式解决问题。

Fragment添加

之前的Fragment添加方式如下:

   val fragmentTag = SimpleContentFragment::class.simpleName
   val findFragment = supportFragmentManager.findFragmentByTag(fragmentTag)
   if (!contentFragment.isAdded && findFragment == null) {
       supportFragmentManager.beginTransaction().add(R.id.contentContainer, contentFragment, fragmentTag).commitAllowingStateLoss()
   } else {
       supportFragmentManager.beginTransaction().show(contentFragment).commitAllowingStateLoss()
   }

因为修改完系统语言回到APP以后,Fragment还在,因此走了show方法。于是对此处代码进行改进,让其重走生命周期:

 val fragmentTag = SimpleContentFragment::class.simpleName
 val findFragment = supportFragmentManager.findFragmentByTag(fragmentTag)
 if (findFragment != null) {
     supportFragmentManager.beginTransaction().remove(findFragment)}

supportFragmentManager.beginTransaction().add(R.id.contentContainer, contentFragment, fragmentTag).commitAllowingStateLoss()

最终解决了上面的问题。

根本原因:系统语言更改导致Activity重建,Fragment被销毁了

感谢大家的支持,如有错误请指正,如需转载请标明原文出处!

http://www.dtcms.com/a/77338.html

相关文章:

  • 零基础上手Python数据分析 (6):Python 异常处理,告别程序崩溃的烦恼!
  • 算法反转字符串
  • springBoot中myBatisPlus的使用
  • python-leetcode 48.括号生成
  • Docker 存储
  • 跨国生产制造企业:如何破解远距离数据传输难题?
  • Android retrofit 接口请求,提示CLEARTEXT communication处理
  • C++20 中线程管理与取消机制的深度剖析
  • SARAD 解读
  • RabbitMQ消息可靠性问题
  • string类--C++
  • 场景题:如何设计一个抢红包随机算法
  • 解析漏洞总结
  • Java 24新特性概述
  • 【初学者】Python语言中有没有指针类型?
  • 夯实 kafka 系列|第一章:初识 kafka
  • 模型(分类模型、回归模型、聚类模型)的评分指标
  • dns实现主服务器
  • leetcode hot100(五)
  • 【实用部署教程】olmOCR智能PDF文本提取系统:从安装到可视化界面实现
  • 企业年度经营计划制定与管理方法论(124页PPT)(文末有下载方式)
  • CSS Grid 布局
  • JVM OOM问题如何排查和解决
  • 面试提问:如何判断 Hive 表是内部表还是外部表?
  • MySQL 入门大全:运算符
  • 基于Selenium Grid的分布式测试架构设计与深度实践
  • springboot444-基于Vue的网络小说交流平台(源码+数据库+纯前后端分离+部署讲解等)
  • 【初学者】请介绍一下线性与非线性的区别?
  • Unity—从入门到精通(第一天)
  • 详细解析格式化消息框的代码