Parcelable的使用以及如何传递复杂的数据类型
1、Understand
Parcelable
在Android
的使用基本是必不可少的 最常用的莫过于启动Activity
时传递数据时使用了 其实除了Parcelable
还可以使用Serializable后者是javaApi中自带的一个接口, 用于保存对象本地文件时使用(俗称序列化), 当然在Android
中虽然也可以使用, 但不推荐使用优点:
Parcelable
相比Serializable效率和性能都要高上不少- 支持
Intent
数据传递,也支持进程间通信
缺点:
Parcelable
用法要比Serializable复杂2、Example
MainBean.class
public class MainBean implements Parcelable { private int id; private boolean normalStatus; private long gmtCreated; private String name; private BigDecimal price; private SecondBean secondBean; private List<SecondBean> secondBeanList; private int[] numberArray; public MainBean () { } //固定写法, 只用修改Creator的泛型 public static Creator<MainBean> getCREATOR() { return CREATOR; } //固定写法, 只用修改Creator的泛型 public static final Creator<MainBean> CREATOR = new Creator<MainBean>() { @Override public MainBean createFromParcel(Parcel in) { return new MainBean(in); } @Override public MainBean[] newArray(int size) { return new MainBean[size]; } }; @Override public int describeContents() { //固定写法 return 0; } protected MainBean(Parcel in) { //单独写了一个readFromParcel和writeToParcel对应, 便于理解 readFromParcel(in); } @Override public void writeToParcel(Parcel out, int flags) { #//切记非常重要, 写数据(out.write...)和下面的读数据(in.read...)的顺序一定要和声明的属性顺序对应上, 不然会因为读写的数据类型不一致而报异常 //普通数据类型int, double, String等等, 用法以此类推 out.writeInt(id); //由于没有写入布尔数据类型的方法, 需要把布尔数据类型转换为String out.writeString(String.valueOf(normalStatus)); out.writeLong(gmtCreated); out.writeString(name); //判空, 因为如果price为null, 也会报异常, 没有写入BigDecimal的数据类型, 需要转为String out.writeString(price == null ? "0" : price.toString()); #//写入对象, 该对象必须也要实现Parcelable接口 out.writeParcelable(secondBean, flags); //写入List集合 out.writeList(secondBeanList); //写入int类型数组, 其他的数组类型以此类推 out.writeIntArray(numberArray); } private void readFromParcel(Parcel in) { #//顺序一定要对应上 id = in.readInt(); //读取的String转为布尔类型 normalStatus = Boolean.valueOf(in.readString()); gmtCreated = in.readLong(); name = in.readString(); //读取的price为String类型, 需要转为BigDecimal price = new BigDecimal(in.readString()); //读取对象实现了Parcelable接口的对象 secondBean = in.readParcelable(SecondBean.class.getClassLoader()); //读取实现了Parcelable接口的对象List secondBeanList = in.readArrayList(SecondBean.class.getClassLoader()); //创建(读取)int类型数组, 其他数组类型以此类推 numberArray = in.createIntArray(); } setMethod()... getMethod()...
SecondBean.class
public class SecondBean implements Parcelable { private int id; public SecondBean() { } public SecondBean(int id){ this.id = id; } protected SecondBean(Parcel in) { id = in.readInt(); } public static final Creator<SecondBean> CREATOR = new Creator<SecondBean>() { @Override public SecondBean createFromParcel(Parcel in) { return new SecondBean(in); } @Override public SecondBean[] newArray(int size) { return new SecondBean[size]; } }; @Override public int describeContents() { return 0; } @Override public void writeToParcel(Parcel out, int flag) { out.writeInt(id); } public static Creator<SecondBean> getCREATOR() { return CREATOR; } setMethod()... getMethod()... }
在Activity中使用
- MainActivity.class
MainBean mainBean = new MainBean(); ....... Intent intent = new Intent(this, SecondActivity.class); intent.putExtra("data", mainBean); startActivity(intent);
- SecondActivity.class
Bundle bundle = getIntent().getExtras(); if (bundle != null) { MainBean mainBean = bundle.getParcelable("data"); }