空值可以传递给包裹吗?

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 点变得明显:

  1. 代码运行完美没有任何NullPointerException
  2. 反序列化的 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)
}

如果您想将其他数据类型(例如 IntegerDoubleBoolean 写入可能为空值的包裹,您可以使用 Parcel.writeSerializable()

从包裹中读回这些值时,您必须将 Parcel.readSerializable() 返回的值转换为正确的数据类型。

Double myDouble = null;
dest.writeSerializable(myDouble);  // Write

Double readValue = (Double) dest.readSerializable();   // Read