Android开发Android开发经验谈

getArguments的ClassCastException,

2018-11-19  本文已影响13人  李良逸

背景

前段时间在进行视频相关业务重构后,上线发现移除比较大量的崩溃,主要集中在魅族用户,安卓6.0以上系统中,崩溃信息如下:

Fatal Exception: java.lang.ClassCastException
java.lang.String cannot be cast to com.netease.nr.biz.video.bean.BaseVideoBean
com.netease.newsreader.newarch.video.detail.main.router.VideoDetailBundleBuilder.parse_aroundBody0 (VideoDetailBundleBuilder.java:39)
com.netease.newsreader.newarch.video.detail.main.router.VideoDetailBundleBuilder$AjcClosure1.run (VideoDetailBundleBuilder.java:1)
org.aspectj.runtime.reflect.JoinPointImpl.proceed (JoinPointImpl.java:149)
com.netease.patch.PatchWeaveUtils.weaveJoinPoint (PatchWeaveUtils.java:66)
com.netease.patch.AspectSpecControler.weavePatchLogic (AspectSpecControler.java:211)
com.netease.patch.AspectSpecControler.weaveAppNewsreader (AspectSpecControler.java:67)
com.netease.newsreader.newarch.video.detail.main.router.VideoDetailBundleBuilder.parse (VideoDetailBundleBuilder.java:36)
com.netease.newsreader.newarch.video.detail.main.view.ViperVideoDetailFragment.initContentFragment_aroundBody66 (ViperVideoDetailFragment.java:386)
com.netease.newsreader.newarch.video.detail.main.view.ViperVideoDetailFragment$AjcClosure67.run (ViperVideoDetailFragment.java:1)

在Fragment一处获取Bundle的地方,Bundle取存入的一个Serializable对象,取出来发现是String,强转成特殊类型BaseVideoBean后崩溃,确认逻辑没有问题后,在Flyme社区咨询无果。

负优化的坑

后来持续调研分析,发现在ViperVideoDetailFragment的onCreate时,获取的Bundle取出Serializable确实为BaseVideoBean类型

image

但是在网络数据回来以后,再去通过getArguments()读取BaseVideoBean类型,就被莫名其妙的负优化成了String类型,打断点准确分析,发现在开启一次子线程操作后(处理本地数据)回到UI线程,该对象就变成了String类型。

image

解决方案

因为魅族存在类似问题,所以getArguments()最好在OnCreate等初始化生命周期统一读取保存为成员变量,便于后续使用,避免类似兼容性问题。

上一篇下一篇

猜你喜欢

热点阅读