Android中Parcel遇到的坑

今天在使用Parcel的时候遇到一个坑。

在项目中要与后台通信,所以根据后台的json数据构建了一个bean对象基本数据不多

    private String backNo;
    private String backSn;
    private List<Integer> regionIds;

然后还有set和get方法,无参和有参构造函数,都是自动生成的,没什么说的,当然开始的时候使用也是没什么问题的。
后来有一个业务需求,bean对象要跨进程调用所以就实现了Parcelable接口,里面也按接口中定义的内容实现了其中的方法, 当然有实现了构造方法

public UploadPrivateAreaRestoreResult(Parcel in) {
        this.backNo = in.readString();
        this.backSn = in.readString();
        in.readList(regionIds,Integer.class.getClassLoader());
    }

就在这时调用的时候总会报一个空指针的错误
List.add的时候会有一个空指针错误。当时检查了几遍没有问题啊,所有的list都是new出来的,怎么会有空指针呢?
于是进行debug,发现问题就在这里

private List<Integer> regionIds;
in.readList(regionIds,Integer.class.getClassLoader());

我们先来看in.readList函数源码

public final void readList(List outVal, ClassLoader loader) {
int N = readInt();
readListInternal(outVal, N, loader);
}
再看readListInternal函数
private void readListInternal(List outVal, int N,
ClassLoader loader) {
while (N > 0) {
Object value = readValue(loader);
//Log.d(TAG, "Unmarshalling value=" + value);
//就在这,我们是直接在方法传入的list中直接调用add方法,因为在创建对象的时候并没有对list进行初始化操作,所以在这里或有空指针异常。
outVal.add(value);
N--;
}
}

总结:我们在bean对象实现Parcelable的时候,对象里面的非基本数据类型参数一定要进行初始化操作。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值