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

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

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

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

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的目的是在解析出来以后保持以前的顺序。this

    主要的思想是:
spa

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

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

相关文章
相关标签/搜索