YY项目之Parcelable传递复杂的对象

Parcelable简单的数据传递就不在此另加介绍了,请移步:Android中Parcelable接口用法

这里主要介绍下Parcelable传递复杂对象的使用方法:

假设我们有一个这样结构的类:

public class Data implements Parcelable {

        public int practice_id;
        public LinkedHashMap<Integer, ArrayList<PracticeBean>> questions;

        public Data(int practice_id, LinkedHashMap<Integer, ArrayList<PracticeBean>> questions) {
            this.practice_id = practice_id;
            this.questions = questions;
        }

        public Data() {

        }

        protected Data(Parcel in) {
            practice_id = in.readInt();
            // 读取之前写入的size
            int size = in.readInt();
            if(questions == null){
                questions = new LinkedHashMap<>();
            }
            for (int i = 0 ;i < size ;i++) {
                Integer key = in.readInt();
                ArrayList<PracticeBean> value = in.readArrayList(PracticeBean.class.getClassLoader());
                questions.put(key, value);
            }
        }

        public static final Creator<Data> CREATOR = new Creator<Data>() {
            @Override
            public Data createFromParcel(Parcel in) {
                return new Data(in);
            }

            @Override
            public Data[] newArray(int size) {
                return new Data[size];
            }
        };

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

        @Override
        public void writeToParcel(Parcel parcel, int i) {
            parcel.writeInt(practice_id);
            // 将LinkedHashMap的大小写进内存,供解析的时候使用
            /*
                这里采用循环写入的方式,之后读取也需要采取相同的协议解析即可
            */
            parcel.writeInt(questions.size());
            for (LinkedHashMap.Entry<Integer, ArrayList<PracticeBean>> entry : questions.entrySet()) {
                parcel.writeInt(entry.getKey());
                parcel.writeList(entry.getValue());
            }
        }

        @Override
        public String toString() {
            return "Data{" +
                    "practice_id=" + practice_id +
                    ", questions=" + questions +
                    '}';
        }
    }

    这里说明下,使用LinkedHashMap的目的是在解析出来之后保持之前的顺序。

    主要的思想是:

    按照一定的协议,将复杂的对象分解为简单的对象直到可以直接使用parcel的实例方法写进内存,然后读取的时候按照相同的协议解析。

    参考:http://stackoverflow.com/questions/8254654/how-write-java-util-map-into-parcel-in-a-smart-way

转载于:https://my.oschina.net/zhangdengjiexuyu/blog/670898

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值