首页 > 解决方案 > 使用 Parcelable 有什么好处?

问题描述

我们引用一个不使用 parcelable 的类对象有什么不同吗?

当我们对 Parcel 赋值时,我们必须创建该类的对象。阅读时也是如此。

如果我们在读写时实际上是在引用一个类对象,那么它与使用 Parcelable 那个类有什么区别呢?

标签: javaandroid

解决方案


虽然实现自定义类需要一点努力Parcelable,但回报是可以轻松地将它们作为附加项传递给Bundle. ABundle是一个数据容器,用于在 Android 世界中的各种组件之间进行通信,另请参阅Parcelables 和 Bundles指南。

考虑您希望将自定义类的实例从 a 传递Activity到 a 的情况Fragment。AFragment有一个参数 Bundle,通常用于初始化Fragment. (我想是因为Bundle如果用户离开应用程序并且整个应用程序停止并在一小时后从后台堆栈恢复,则仍然可以访问。另一方面,如果Fragment没有,任何通过构造函数传入的值都将丢失不要将它们保存在另一个BundleonSaveInstanceState()

因此,如果可以将值存储在Bundle. 属于实现类Parcelable的对象与原始数据类型、一些数组、列表和可序列化对象一起属于这种类型。

如果无需进行类强制转换就可以检索值,那就更方便了,这就是为什么我Parcelable尽可能Serializable喜欢:

假设我们有两个Serializable分别实现的类Parcelable。假设我们有一个Bundle b = getArguments();

要检索Serializable值,您需要以下语句

SomeSerializableClass instanceOfSerializableClass = (SomeSerializableClass)b.getSerializable("keyForSerializableValue");

而对于Parcelable你可以写的值

SomeParcelableClass instanceOfParcelableClass = b.getParcelable("keyForParcelableValue");

在 Kotlin 中,我们遇到了语句比 Java 对应语句长的罕见情况之一:

val instanceOfSerializableClass: SomeSerializableClass? = b.getSerializable("keyForSerializableValue") as SomeSerializableClass

相比

val instanceOfParcelableClass = b.getParcelable<SomeParcelableClass>("keyForParcelableValue");

推荐阅读