63

关于我的代码示例,如果一个 Locable 的变量为空,我该怎么办?例如,现在如果 l.getZoom() 返回 null,我得到 NullPointerException。

@Override
public void writeToParcel(Parcel parcel, int arg1) {
    parcel.writeInt(count);
    for(Locable l:locableArr){
        parcel.writeInt(l.getOriginId());
        parcel.writeInt(l.getLocableType());
        parcel.writeInt(l.getZoom());
        parcel.writeDouble(l.getLatituda());
        parcel.writeDouble(l.getLongituda());
        parcel.writeString(l.getTitle());
        parcel.writeString(l.getSnipet());
    }

}

谢谢!

4

4 回答 4

114

您可以Parcel.writeValue用于编组具有空值的通用对象。

于 2012-05-26T21:21:13.633 回答
24

我正在使用一个Parcelable具有IntegerBoolean字段的类,并且这些字段可以为空。

我在使用通用Parcel.writeValue方法时遇到了麻烦,尤其是当我试图通过Parcel.readValue. 我不断收到一个运行时异常,它说它无法确定打包对象的类型。

最终,我能够通过使用Parcel.writeSerializableParcel.readSerializable类型转换来解决这个问题,同时Integer实现Boolean了 Serializable 接口。read 和 write 方法null为您处理值。

于 2015-05-01T22:40:11.130 回答
16

这是我想出的安全编写字符串的解决方案:

private void writeStringToParcel(Parcel p, String s) {
    p.writeByte((byte)(s != null ? 1 : 0));
    p.writeString(s);
}

private String readStringFromParcel(Parcel p) {
    boolean isPresent = p.readByte() == 1;
    return isPresent ? p.readString() : null;
}
于 2012-12-20T20:39:32.583 回答
14

我见过的大多数序列化代码都使用任一标志来指示值的存在/不存在,或者在值之前使用计数字段(例如,在写入数组时),如果值不存在,则计数字段仅设置为零根本不存在。

检查 Android 核心类的源代码会发现如下代码(来自 Message 类):

    if (obj != null) {
        try {
            Parcelable p = (Parcelable)obj;
            dest.writeInt(1);
            dest.writeParcelable(p, flags);
        } catch (ClassCastException e) {
            throw new RuntimeException(
                "Can't marshal non-Parcelable objects across processes.");
        }
    } else {
        dest.writeInt(0);
    }

或者这个(来自 Intent 类):

    if (mCategories != null) {
        out.writeInt(mCategories.size());
        for (String category : mCategories) {
            out.writeString(category);
        }
    } else {
        out.writeInt(0);
    }

我的建议:在您的代码中,如果“zoom == null”和“zoom == 0”之间没有功能差异,那么我只需将缩放声明为原语(int而不是Integer)或在构造函数中将其初始化为零并且确保您永远不会将其设置为 null(这样您就可以保证它永远不会为 null,并且您不必在序列化/反序列化方法中添加特殊代码来处理它)。

于 2012-05-24T10:35:33.513 回答