【工作总结】Fragment 实例化浅析

image.png

Fragment 实例化浅析


智能微投项目中,蓝牙遥控器与 Device 连接成功后,按返回键,设置出现闪退,定位打印如下:

image_1bj569mk015od1s67jru1nj1rvq2q.png-247.4kB
image_1bj569mk015od1s67jru1nj1rvq2q.png-247.4kB

查看并分析打印信息,闪退的打印信息以前也出现过,但没有重视,在微投项目中百分百复现,关键打印信息如下:

image_1bj56dsv41dp9haj1bge1c8liqm37.png-43.2kB
image_1bj56dsv41dp9haj1bge1c8liqm37.png-43.2kB
image_1bj56emgi1e07gqt14kmmba13uv3k.png-31.2kB
image_1bj56emgi1e07gqt14kmmba13uv3k.png-31.2kB
Caused by: android.support.v4.app.Fragment$InstantiationException: 
Unable to instantiate fragment ,
make sure class name exists, is public, 
and has an empty constructor that is public

定位问题出现在make sure class name exists, is public, and has an empty constructor that is public

异常的原因是没有 Fragment 无参数 public 构造函数,添加 Public 无参构造函数后,微投项目问题解决,但为什么其他项目能正常运行,而微投在蓝牙配对后会出现闪退。

查看Fragment 源码Instantiation方法:
This is the same as calling its empty 构造函数,instantiate 函数catch 打印正好是闪退异常时候打印,异常的确来源于此

image_1bj51c34q1fopo351136a664vf1j.png-127.9kB
image_1bj51c34q1fopo351136a664vf1j.png-127.9kB

instantiate 函数功能是通过 Java 反射机制实例化 Fragment;

Fragment f = (Fragment)clazz.newInstance();

查看newInstance()源码:


image_1bj523ip01f6s1ia413crsfodfi20.png-146.8kB
image_1bj523ip01f6s1ia413crsfodfi20.png-146.8kB

The class is instantiated expression with an empty argument list
类被实例化需无参 构造函数;

查看Fragment 无参构造函数源码:


image_1bj52fst4dgc1f9s38kil81u92d.png-59.9kB
image_1bj52fst4dgc1f9s38kil81u92d.png-59.9kB

总结:当系统因为内存紧张杀死非前台进程(并非真正的杀死),然后我们将被系统杀掉的非前台app带回前台,如果这个时候有UI是呈现在Fragment中,那么会因为restore造成fragment需要通过反射实例对象,从而将之前save的状态还原,而这个反射实例对象就是fragment需要Public的empty constructor的关键所在

问题解决方案:

  1. 添加 public 无参构造函数;
  2. 在含有参数的 Fragment 构造函数上添加注解@SuppressLint("ValidFragment")(避免使用非默认构造函数,因为Fragment源码中用到反射构造了对象,是无参数的构造函数)
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 176,042评论 25 709
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 136,005评论 19 139
  • importUIKit classViewController:UITabBarController{ enumD...
    明哥_Young阅读 9,464评论 1 10
  • 仿佛光芒越来越柔和温暖了。 不在那么急着闪耀了 需要被照耀,定会靠向那束光芒
    关于那束光阅读 1,751评论 0 0
  • 扯下云彩的一角 浇进我的果园 让那满树的果实 长进我的胃里
    子龙老师阅读 2,206评论 11 17

友情链接更多精彩内容