空值可以传递给包裹吗?
Can Nulls be passed to parcel?
是否可以在拆分对象时将null
写入Parcel
,并在再次拆分时再次返回null
?
假设我们有以下代码:
public class Test implements Parcelable {
private String string = null;
public Test(Parcel dest, int flags) {
source.writeString(string);
}
}
使用 Parcel.readString()
从包裹中读回此值时,我会得到 NullPointerException
吗?
或者我会得到一个 null
值吗?
是的,您可以将 null
传递给 Parcel.writeString(String)
方法。
当你用Parcel.readString()
再次读出时,你会得到一个null
值。
例如,假设您有一个包含以下字段的 class:
public class Test implements Parcelable {
public final int id;
private final String name;
public final String description;
...
您像这样创建 Parcelable
实现(使用 Android Studio autoparcelable 工具):
@Override
public void writeToParcel(Parcel dest, int flags) {
dest.writeInt(id);
dest.writeString(null); // NOTE the null value here
dest.writeString(description);
}
protected Test(Parcel in) {
id = in.readInt();
name = in.readString();
description = in.readString();
}
当 运行 此代码,并在 Intent
中将 Test
对象作为 Parcelable extra 传递时,2 点变得明显:
- 代码运行完美没有任何
NullPointerException
- 反序列化的
Test
对象有一个值 name == null
你可以在这个相关问题的评论中看到类似的信息:
- Parcel, ClassLoader and Reading Null values
以我为例
(科特林)
override fun writeToParcel(parcel: Parcel, flags: Int) {
parcel.writeInt(if (PapperId == null) -1 else PapperId)
parcel.writeString( if (Nome == null) "" else Nome)
}
如果您想将其他数据类型(例如 Integer
、Double
、Boolean
写入可能为空值的包裹,您可以使用 Parcel.writeSerializable()
。
从包裹中读回这些值时,您必须将 Parcel.readSerializable()
返回的值转换为正确的数据类型。
Double myDouble = null;
dest.writeSerializable(myDouble); // Write
Double readValue = (Double) dest.readSerializable(); // Read
是否可以在拆分对象时将null
写入Parcel
,并在再次拆分时再次返回null
?
假设我们有以下代码:
public class Test implements Parcelable {
private String string = null;
public Test(Parcel dest, int flags) {
source.writeString(string);
}
}
使用 Parcel.readString()
从包裹中读回此值时,我会得到 NullPointerException
吗?
或者我会得到一个 null
值吗?
是的,您可以将 null
传递给 Parcel.writeString(String)
方法。
当你用Parcel.readString()
再次读出时,你会得到一个null
值。
例如,假设您有一个包含以下字段的 class:
public class Test implements Parcelable {
public final int id;
private final String name;
public final String description;
...
您像这样创建 Parcelable
实现(使用 Android Studio autoparcelable 工具):
@Override
public void writeToParcel(Parcel dest, int flags) {
dest.writeInt(id);
dest.writeString(null); // NOTE the null value here
dest.writeString(description);
}
protected Test(Parcel in) {
id = in.readInt();
name = in.readString();
description = in.readString();
}
当 运行 此代码,并在 Intent
中将 Test
对象作为 Parcelable extra 传递时,2 点变得明显:
- 代码运行完美没有任何
NullPointerException
- 反序列化的
Test
对象有一个值name == null
你可以在这个相关问题的评论中看到类似的信息:
- Parcel, ClassLoader and Reading Null values
以我为例 (科特林)
override fun writeToParcel(parcel: Parcel, flags: Int) {
parcel.writeInt(if (PapperId == null) -1 else PapperId)
parcel.writeString( if (Nome == null) "" else Nome)
}
如果您想将其他数据类型(例如 Integer
、Double
、Boolean
写入可能为空值的包裹,您可以使用 Parcel.writeSerializable()
。
从包裹中读回这些值时,您必须将 Parcel.readSerializable()
返回的值转换为正确的数据类型。
Double myDouble = null;
dest.writeSerializable(myDouble); // Write
Double readValue = (Double) dest.readSerializable(); // Read