我试图了解如何正确地从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读取空值的最佳方法是什么?
每次尝试从包裹中读取时,是否需要检查空值?但如果模型中有很多字段,那就太多了。
阅读时传递null
或ClassLoader
之间有区别吗?
如果在读取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
答案 0 :(得分:0)
如何使用ClassLoader
提供MyModel.class. getClassLoader()
?
答案 1 :(得分:-1)
我认为最好的方法是在name
之前写出字符串name
的长度。如果name
为空,则只写0作为其长度,不要写name
。阅读时,如果读取length
且其值为零,请不要阅读name
,只需将name
设置为null
。