activity之间传值,解决:Parcelable encountered IOException writing serializable object异常

    xiaoxiao2021-04-18  58

    今天写代码的时候遇到了两个activity之间需要传数据,本来是一件非常简单的事情

    平常都是使用 intent.putExtra(type,value);就没问题了。

    传对象的话就需要实现序列化接口了就行了。

    为什么要实现序列化接口,你可以当这个是android的一个机制,就是得这么办,不这么办不行。

    实际上实现序列化接口就是为了让数据能变成一种可存储或可传输的状态,可以传输到网络,也可以传输到本地。所以activity之间,你要是不实现序列化接口,那么你在SecondActivity中操作FirstActivity中的数据必将会导致内存泄露。

    java中的实现序列化的方式有两种

    1实现Serializable接口 

    2.实现Parcelable 接口

    关于这两个接口的区别呢,在这里正好回忆一下吧

    从写代码上来说:

    Serializable:实现这个非常简单,直接 implement 就完了,什么都不用写,当然 你要是想写,声明一个 serialVersionUID 变量 就ok了,

    serialVersionUID  的话 Android Studio 默认是不会自动生成的,你需要配置一下:

    File -> Settings -> Editor -> Inspections -> Java -> Serialization issues -> Serializable class without 'serialVersionUID' 勾上 然后 apply 、ok 就好了。

    代码上实现Serialazable就是这么的简单

    Parcelable:这个的话就有点复杂了,你需要 implement 这个 接口 然后 重写 

    构造方法 (传入Parcel对象)

    descirbeContents方法 

    writeToParcel方法 

    创建一个Parcelable.Creator对象

    Android Studio 有 生成Parcelable的插件 可以直接导入插件:File -> Setting -> Plugins -> Browse Respositories 然后搜索 Parcelable 安装

    ,就可以直接在model里一键导入Parcelable接口了,可以省去很大一部分时间

    从实际使用角度上来看:

    1.使用内存的使用,Parcelable比Serializable性能高

    2.Serializable在序列化时会产生大量的临时变量,引起频繁GC

    3.Parcelable不能使用在要将数据存储在磁盘的情况,因为Parcelable不能很好的保证数据的持续性在外界有变化的情况下。

    具体使用还是看自己的需求吧

    下面说一下自己的错误。。

    从网络上得到的数据 然后 我实现了Serializable接口 传递到第二个activity中,结果突然给我报了一个:Parcelable encountered IOException writing serializable object

    然后查看自己的代码,发现并没有实现Parcelable接口啊,然后想到以前好像见过这个异常,是因为内部分没有实现Serializable接口,但是回到代码一看,虽然有内部类,但是我也实现了Serializable接口了啊,为什么还会报这个异常呢?!!!

    。。。。。

    然后找了好久才发现是因为自己的model类中有一个Bitmap对象,,这个对象本身已经实现了Parcelable接口。。所以才会出现那个异常,然后直接把类改为实现Parcelable接口,然后运行,果然好了。

    对了,我们最好不要直接传Bitmap对象,因为如果Bitmap尺寸过大的话就会引起崩溃,以前试过应该是大于512k就会crash掉。所以我们最好把Bitmap缓存下来直接传路径就可以了

    转载请注明原文地址: https://ju.6miu.com/read-674827.html

    最新回复(0)