Android在开发中的实用技巧之Parcelable的使用以及如何传递复杂的数据类型
16lz
2021-01-25
根据已上线的app里总结出来的实用小技巧
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 secondBeanList; private int[] numberArray; public MainBean () { } //固定写法, 只用修改Creator的泛型 public static Creator getCREATOR() { return CREATOR; } //固定写法, 只用修改Creator的泛型 public static final Creator CREATOR = new Creator() { @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 CREATOR = new Creator() { @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 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"); }
更多相关文章
- Android(安卓)JSON:Gson,FastJson解析库的使用和对比分析
- 信息提醒之Notification,兼容全部SDK-更新中
- Android(安卓)SDK中的强大工具——Monitor(一)
- Android基于HTTP网络编程总结浅析
- Android(安卓)App 中简易的网络数据处理方法
- 面试技术汇总
- Kotlin, Android的Swift
- Android之全面解析Retrofit网络框架封装库
- android中常见的设计模式有哪些?