android parcelable 接口原理

1.parcelable是什么:

  它是一个序列化对象的一个接口,和Serializable的功能一样,不过android 一般都常用parcelable,此接口效率更高

2.为什么要使用parcelable

  我们常用Intent 来传输数据,不过你有看到Intent能传递一个自己创建 的对象么;答案是没有,都是传递的基本数据类型;那么怎么样传输这样的对象,于是parcelable 就出现了

3.parcelable 的实现例子

 public class PemCheckItem implements Parcelable{
private String deptName;

private Date checkDate;

public PemCheckItem() {
}
public PemCheckItem(Parcel source) {
setDeptName(source.readString());

setCheckDate((Date) source.readSerializable());

}
public String getDeptName() {
return deptName;
}
public void setDeptName(String deptName) {
this.deptName = deptName;
}

public Date getCheckDate() {
return checkDate;
}
public void setCheckDate(Date checkDate) {
this.checkDate = checkDate;
}
public void setCheckDate(String pemExamDateString, String fomatString) {
try {
this.checkDate = new SimpleDateFormat(fomatString).parse(pemExamDateString);
} catch (ParseException e) {

}
}

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


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


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

};
@Override
public int describeContents() {
return 0;
}
@Override
public void writeToParcel(Parcel dest, int flags) {
dest.writeString(deptName);

dest.writeSerializable(checkDate);

}
}

即:实现parcelable需要有几步:

   1).实现 一个writeToparcel(Parcel dest, int falgs) ;   

   2).实现一个creater 的创建类;

   3).写一个构造方法public PemCheckItem(Parcel source) 

 此3 步有什么作用:

   我们用Intent 来传输数据时其实  Intent会把我们的对象先转成parcelable对象,在由parcelable对象将其转成我们需要的对象,即一个(写入与写出的过程)那么它是怎么转的

   我们看到有一个writeToparcel皯方法就是写入方法   还有一个creater创造器里有一个方法为return new PemCheckItem(parcelable in);此方法为写出过程,然后调用我们实现 的构造方法将里面的数据写出;这里有对应的writeString ,如果是时间则需要的是writeserializable方法;


@Override
public int describeContents() 这里还有一个继承方法,不用管,按时此方法写就行了;

还有一种复杂的即parcelable里有一个实现此接口对象的List集合

如public class PemCheck implements Parcelable{
private String deptName;

private Date checkDate;
private List<PemCheckItem> itemList = new ArrayList<PemCheckItem>();
public PemCheck() {
}
public PemCheck(Parcel source) {
setDeptName(source.readString());
setCheckDate((Date) source.readSerializable());
Parcelable[] itemArray = source.readParcelableArray(PemCheckItem.class.getClassLoader());
for(int i = 0; i < itemArray.length; i++){
if(itemArray[i] instanceof PemCheckItem){
addItem((PemCheckItem) itemArray[i]);
}
}
}

public String getDeptName() {
return deptName;
}
public void setDeptName(String deptName) {
this.deptName = deptName;
}

public Date getCheckDate() {
return checkDate;
}
public void setCheckDate(Date checkDate) {
this.checkDate = checkDate;
}
@SuppressLint("SimpleDateFormat")
public void setCheckDate(String pemExamDateString, String fomatString) {
try {
this.checkDate = new SimpleDateFormat(fomatString).parse(pemExamDateString);
} catch (ParseException e) {

}
}
public List<PemCheckItem> getItemList() {
return itemList;
}
public void setItemList(List<PemCheckItem> itemList) {
this.itemList = itemList;
}
public void addItem(PemCheckItem item){
if(itemList == null){
itemList = new ArrayList<PemCheckItem>();
}
itemList.add(item);
}
public static final Parcelable.Creator<PemCheck> CREATOR = new Parcelable.Creator<PemCheck>(){


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


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

};
@Override
public int describeContents() {
return 0;
}
@Override
public void writeToParcel(Parcel dest, int flags) {
dest.writeString(deptName);
dest.writeSerializable(checkDate);
dest.writeParcelableArray(itemList.toArray(new PemCheckItem[itemList.size()]), PARCELABLE_WRITE_RETURN_VALUE);
}
}

两个地方需要注意:

1.首先是用的方法 为writeParcleableArray(itemList.toArray(new PenCheckItem[itemlist.size0]),Parcelable_write_return_value);

转换成了数组,

2.转出的时候:

Parcelable[] itemArray = source.readParcelableArray(PemCheckItem.class.getClassLoader());

首先为先得到数据,我也不知道为什么这样写,有大神请解释一下:用classloader();

然后通过一个循环将数据放入集合中即可!



 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值