onSaveInstanceState()与setArguments()方法引起的序列化问题

情景描述

用友盟进行分享图片,应用界面继承是的DialogFragment,然后在跳转到分享渠道其他app后,自己的app会崩溃重启,观察log后发现报的错误是 Parcelable encountered IOException writing serializable object。

崩溃分析

根据报错信息我知道了是序列化错误,于是去看了下传值的地方,然后回出现这个错误类中看见已经实现了serializable,并且内部的自定义类对象也实现了serializable。
可是为什么还是会出现这个错误呢?
通过观察现象发现崩溃都是在我跳转到其他应用后一会儿崩溃的,在本应用打开该界面不会出现任何问题,那会不会是回收引起的原因呢?

定位问题

去出问题的界面中实现onSaveInstanceState()方法,并观察父类中该方法做了些什么。然后发现该方法主要用来做:在界面出于意外情况消失时保存临时数据,主要用来后面的界面恢复。参考文章:onSaveInstanceStante()方法什么时候被调用?(转载/整理)
那么我们数据是怎么存到对应的bundle里呢,很明显我们并没有做数据保存处理,该方法怎么知道我要保存哪个bundle呢。
然后我看见了我传值的方法setArguments()。这个方法恰好是用来做上面情况的数据保存作用。参考文章:为什么要用Fragment.setArguments(Bundle bundle)来传递参数
注:意外情况包括用户按home键,横竖屏切换,应用切换跳转

结论

在fragment中使用Serializable序列化进行保存值会出现序列化异常,原因是回收时使用的序列化方法是Parcelable。所以将序列化类实现Parcelable即可解决问题。
ps:结论有猜测的成分存在,因为本人对上述的两个方法还没仔细进行观察学习。如有错漏,还请指出,后面学习后有问题的地方会进行修改更正。

猜你喜欢

转载自blog.csdn.net/qq_39734865/article/details/104522703