Parcel,ClassLoader和Reading Null值

时间:2014-10-07 01:03:00

标签: java android parcelable parcel

我试图了解如何正确地从Parcel读取空值。让我们看看我的用例:

public class MyModel implements Parcelable {
    private Long id;
    private String name;

    public MyModel() {}

    public MyModel(Parcel in) {
        readFromParcel(in);
    }

    @Override public int describeContents() {
        return 0;
    }

    @Override public void writeToParcel(Parcel dest, int flags) {
        dest.writeValue(id);
        dest.writeValue(name);
    }

    public void readFromParcel(Parcel in) {
        id = (Long) in.readValue(Long.class.getClassLoader());
        name = (String) in.readValue(String.class.getClassLoader());
    }
}

为了解决这个问题,我们举一个name类型的字段String的例子。

我知道我可以使用writeString代替writeValue,但如果writeString为空,则NullPointerException会抛出name

所以现在真正的问题是,如果name为null并且我尝试readValue然后将null转换为String将抛出异常。

在这种情况下,从Parcel读取空值的最佳方法是什么? 每次尝试从包裹中读取时,是否需要检查空值?但如果模型中有很多字段,那就太多了。 阅读时传递nullClassLoader之间有区别吗? 如果在读取Parcel时值为null,那么类加载器是否返回空/默认对象

我经常得到的错误就是这个,当它从包裹中读取其中一个字符串时会发生:

java.lang.RuntimeException: Unable to start activity ComponentInfo{com.company.MyActivity}: java.lang.RuntimeException: Parcel android.os.Parcel@42b82908: Unmarshalling unknown type code 7209045 at offset 1368

2 个答案:

答案 0 :(得分:0)

如何使用ClassLoader提供MyModel.class. getClassLoader()

答案 1 :(得分:-1)

我认为最好的方法是在name之前写出字符串name的长度。如果name为空,则只写0作为其长度,不要写name。阅读时,如果读取length且其值为零,请不要阅读name,只需将name设置为null