您的位置:首页 > 移动开发 > Objective-C

实现Parcelable接口,Writing a list of parcelable objects to a parcelable object

2017-02-26 23:21 573 查看
问题回答参考:http://stackoverflow.com/questions/19955482/writing-a-list-of-parcelable-objects-to-a-parcelable-object

关于Parcelable转自简书博客:http://www.jianshu.com/p/b1fcff2728bd

什么是Parcelable接口

作用:给类设计的接口,类一旦实现这个接口,该类的对象即可进行一个“从对象存储为Parcel , 从Parcel读取为对象”的一个读写过程。

目的:实现序列化

原因:

序列化,为了:

1) 永久保存对象,保存对象的字节到本地文件中

2) 通过序列化对象在网络中传递对象

3) 通过序列化在进程间传递对象

与Serializable对比:

1)在使用Intent传递数据时:

Serializable: Bundle.putSerializable(Key, 实现了Serializable的对象);

Parcelable: Bundle.putParcelable(Key, 实现了Parcelable的对象);

2)内存使用性能上:

Parcelable > Serializable

由于Serializable在序列化时会产生大量的临时变量,从而引起频繁的GC。

3)数据存储在磁盘上的情况:

Serialzable > Parcelable

Parcelable不能使用在要将数据存储在磁盘上的情况,因为Parcelable不能很好的保证数据的持续性在外界有变化的情况下。尽管Serializable效率低点,但此时还是建议使用Serializable

支持的成员数据类型:

1) 普通数据类型【如:int、double等以及他们的封装类如Integer、Float等】以及他们的数组类型【如:int[]、double[]等】注意:不支持:List[Integer]类型等List类型

2) String/CharSequence及其数组String[]、ArrayList[String]

3) Bundle 和 List

4) Serializable 注意:不支持List

5) Binder 和 List ,IBinder 和 List

6) Parcelable实现类

重温:Intent/Bundle传递支持的数据类型有:

基本数据类型和它的数组类型

String/CharSequence和它的数组类型

Serializable

Parcelable

而至于List<实体类> xxx如何读写,见下面代码片段,Cast和Avatars类都实现了Parcelable类,略过。

package com.helin.rxsample.enity;

import android.annotation.SuppressLint;
import android.os.Parcel;
import android.os.Parcelable;

import java.util.ArrayList;
import java.util.List;

/**
* Created by liukun on 16/3/5.
*/
@SuppressLint("ParcelCreator")
public class Subject implements Parcelable{

private String id;
private String alt;
private String year;
private String title;
private String original_title;
private List<String> genres;
private List<Cast> casts = new ArrayList<>();
private List<Cast> directors = new ArrayList<>();
private Avatars images;

@Override
public String toString() {
return "Subject.id=" + id
+ " Subject.title=" + title
+ " Subject.year=" + year
+ " Subject.originalTitle=" + original_title + casts.toString() + directors.toString() + " | ";
}

public String getId() {
return id;
}

public void setId(String id) {
this.id = id;
}

public String getAlt() {
return alt;
}

public void setAlt(String alt) {
this.alt = alt;
}

public String getYear() {
return year;
}

public void setYear(String year) {
this.year = year;
}

public String getTitle() {
return title;
}

public void setTitle(String title) {
this.title = title;
}

public String getOriginal_title() {
return original_title;
}

public void setOriginal_title(String original_title) {
this.original_title = original_title;
}

public List<String> getGenres() {
return genres;
}

public void setGenres(List<String> genres) {
this.genres = genres;
}

public List<Cast> getCasts() {
return casts;
}

public void setCasts(List<Cast> casts) {
this.casts = casts;
}

public List<Cast> getDirectors() {
return directors;
}

public void setDirectors(List<Cast> directors) {
this.directors = directors;
}

public Avatars getImages() {
return images;
}

public void setImages(Avatars images) {
this.images = images;
}

protected Subject(Parcel in){
id = in.readString();
alt = in.readString();
year = in.readString();
title = in.readString();
original_title = in.readString();
genres = in.createStringArrayList();
//        in.readList(casts,casts.getClass().getClassLoader());
//        in.readList(directors,directors.getClass().getClassLoader());
**in.readTypedList(casts,Cast.CREATOR);
in.readTypedList(directors,Cast.CREATOR);**
images = in.readParcelable(images.getClass().getClassLoader());
}

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

/* private String id;
private String alt;
private String year;
private String title;
private String original_title;
private List<String> genres;
private List<Cast> casts;
private List<Cast> directors;
private Avatars images;*/
@Override
public void writeToParcel(Parcel dest, int flags) {
dest.writeString(this.id);
dest.writeString(this.alt);
dest.writeString(this.year);
dest.writeString(this.title);
dest.writeString(this.original_title);
dest.writeStringList(this.genres);
//        dest.writeList(this.casts);
//        dest.writeList(this.directors);
**dest.writeTypedList(casts);
dest.writeTypedList(directors);**
dest.writeParcelable(this.images,flags);
}

public static final Parcelable.Creator<Subject> CREATOR = new Parcelable.Creator<Subject>(){

@Override
public Subject createFromParcel(Parcel source) {
return new Subject(source);
}

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

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: