项目实训(二十一)intent借助parcelable接口传递对象数组

安卓里的序列化接口有两个,Serializable和Parcelable。前者使用非常简单,只需要实现该接口,后者还需要实现几个接口里的方法等。

在通过intent传递一个对象的时候,我通常让该对象类实现Serialazable,然后用bundle.putSerializable就可以了。但是要传递一个对象数组的时候,我发现bundle并没有putSerializableArray或putSerializableArrayList,而是有putParcelableArray和putParcelableArrayList,也就是说,想传递对象数组就要让对象类实现Parcelable接口。

 

以我的一个数据类为例:

public class AtItem implements Parcelable{
    private String id,nickName,userTitle,signature;

 

 

 

 

1.首先要实现该接口的两个方法:

describeCount:内容描述,没什么用,默认返回0即可。

writeToParcel: 序列化,将对象的字段写入一个Parcel对象。也就是对象-->Parcel

 

 

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

    @Override
    public void writeToParcel(Parcel parcel, int i) {
        parcel.writeString(id);
        parcel.writeString(nickName);
        parcel.writeString(userTitle);
        parcel.writeString(signature);
    }

 

 

 

 

 

 

2.根据parcel生成构造器:

生成以一个Parcel对象为参数的构造器,然后根据parcel读出数据为字段赋值,字段顺序要和上面的writeToParcel保持一致。也就是Parcel-->对象

    public AtItem(Parcel p){
        id=p.readString();
        nickName=p.readString();
        userTitle=p.readString();
        signature=p.readString();
    }

感觉这种根据开发者自觉统一顺序好像不太可靠啊,不过应该挺高效的。

 

 

3.持有一个Parcelable.Creator静态实例,用于反序列化(CREATOR这个变量名不能变):

    public static final Parcelable.Creator<AtItem> CREATOR=new Creator<AtItem>() {
        @Override
        public AtItem createFromParcel(Parcel parcel) {
            return new AtItem(parcel);
        }

        @Override
        public AtItem[] newArray(int i) {
            return new AtItem[i];
        }
    };

 

 

 

实现了两个方法,第一个根据parcel调用那个构造器,也就是反序列化过程,第二个是数组的反序列化过程,返回数组的index号元素即可。

 

过程已经很明显了,序列化:对象写入一个parcel对象。反序列化:CREATOR调用createFromParcel将parcel传递给对象的构造器生成对象。

 

最后,看看Intent传递和解析这个对象数组(这里我用的是向前一个活动的回传):

        Intent intent = new Intent();
        Bundle bundle = new Bundle();
        bundle.putParcelableArrayList("result", (ArrayList<? extends Parcelable>) listResult);
        intent.putExtras(bundle);
        setResult(RESULT_OK, intent);
        finish();

解析:

 

 

List<AtItem> listnow=data.getExtras().getParcelableArrayList("result");

 

 

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值