Android Parcelable接口使用方法详解
android parcelable接口使用方法详解
1. parcelable接口
interface for classes whose instances can be written to and restored from a parcel。 classes implementing the parcelable interface must also have a static field called creator, which is an object implementing the parcelable.creator interface。
2.实现parcelable就是为了进行序列化,那么,为什么要序列化?
1)永久性保存对象,保存对象的字节序列到本地文件中;
2)通过序列化对象在网络中传递对象;
3)通过序列化在进程间传递对象。
3.实现序列化的方法
android中实现序列化有两个选择:一是实现serializable接口(是javase本身就支持的),一是实现parcelable接口(是android特有功能,效率比实现serializable接口高效,可用于intent数据传递,也可以用于进程间通信(ipc))。实现serializable接口非常简单,声明一下就可以了,而实现parcelable接口稍微复杂一些,但效率更高,推荐用这种方法提高性能。
注:android中intent传递对象有两种方法:一是bundle.putserializable(key,object),另一种是bundle.putparcelable(key,object)。当然这些object是有一定的条件的,前者是实现了serializable接口,而后者是实现了parcelable接口。
4.选择序列化方法的原则
1)在使用内存的时候,parcelable比serializable性能高,所以推荐使用parcelable。
2)serializable在序列化的时候会产生大量的临时变量,从而引起频繁的gc。
3)parcelable不能使用在要将数据存储在磁盘上的情况,因为parcelable不能很好的保证数据的持续性在外界有变化的情况下。尽管serializable效率低点,但此时还是建议使用serializable 。
5.应用场景
需要在多个部件(activity或service)之间通过intent传递一些数据,简单类型(如:数字、字符串)的可以直接放入intent。复杂类型必须实现parcelable接口。
6、parcelable接口定义
public interface parcelable { //内容描述接口,基本不用管 public int describecontents(); //写入接口函数,打包 public void writetoparcel(parcel dest, int flags); //读取接口,目的是要从parcel中构造一个实现了parcelable的类的实例处理。因为实现类在这里还是不可知的,所以需要用到模板的方式,继承类名通过模板参数传入 //为了能够实现模板参数的传入,这里定义creator嵌入接口,内含两个接口函数分别返回单个和多个继承类实例 public interface creator<t> { public t createfromparcel(parcel source); public t[] newarray(int size); } }
7、实现parcelable步骤
1)implements parcelable
2)重写writetoparcel方法,将你的对象序列化为一个parcel对象,即:将类的数据写入外部提供的parcel中,打包需要传递的数据到parcel容器保存,以便从 parcel容器获取数据
3)重写describecontents方法,内容接口描述,默认返回0就可以
4)实例化静态内部对象creator实现接口parcelable.creator
public static final parcelable.creator<t> creator
注:其中public static final一个都不能少,内部对象creator的名称也不能改变,必须全部大写。需重写本接口中的两个方法:createfromparcel(parcel in) 实现从parcel容器中读取传递数据值,封装成parcelable对象返回逻辑层,newarray(int size) 创建一个类型为t,长度为size的数组,仅一句话即可(return new t[size]),供外部类反序列化本类数组使用。
简而言之:通过writetoparcel将你的对象映射成parcel对象,再通过createfromparcel将parcel对象映射成你的对象。也可以将parcel看成是一个流,通过writetoparcel把对象写到流里面,在通过createfromparcel从流里读取对象,只不过这个过程需要你来实现,因此写的顺序和读的顺序必须一致。
代码如下:
public class myparcelable implements parcelable { private int mdata; public int describecontents() { return 0; } public void writetoparcel(parcel out, int flags) { out.writeint(mdata); } public static final parcelable.creator<myparcelable> creator = new parcelable.creator<myparcelable>() { public myparcelable createfromparcel(parcel in) { return new myparcelable(in); } public myparcelable[] newarray(int size) { return new myparcelable[size]; } }; private myparcelable(parcel in) { mdata = in.readint(); } }
8、serializable实现与parcelabel实现的区别
1)serializable的实现,只需要implements serializable 即可。这只是给对象打了一个标记,系统会自动将其序列化。
2)parcelabel的实现,不仅需要implements parcelabel,还需要在类中添加一个静态成员变量creator,这个变量需要实现 parcelable.creator 接口。
两者代码比较:
1)创建person类,实现serializable
public class person implements serializable { private static final long serialversionuid = -7060210544600464481l; private string name; private int age; public string getname() { return name; } public void setname(string name) { this.name = name; } public int getage() { return age; } public void setage(int age) { this.age = age; } }
2)创建book类,实现parcelable
public class book implements parcelable { private string bookname; private string author; private int publishdate; public book() { } public string getbookname() { return bookname; } public void setbookname(string bookname) { this.bookname = bookname; } public string getauthor() { return author; } public void setauthor(string author) { this.author = author; } public int getpublishdate() { return publishdate; } public void setpublishdate(int publishdate) { this.publishdate = publishdate; } @override public int describecontents() { return 0; } @override public void writetoparcel(parcel out, int flags) { out.writestring(bookname); out.writestring(author); out.writeint(publishdate); } public static final parcelable.creator<book> creator = new creator<book>() { @override public book[] newarray(int size) { return new book[size]; } @override public book createfromparcel(parcel in) { return new book(in); } }; public book(parcel in) { bookname = in.readstring(); author = in.readstring(); publishdate = in.readint(); } }
以上就是 android parcelable接口的使用方法,如有疑问请留言或者到本站社区交流讨论,感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!