Android中Parcelable的使用详解
parcelable与serializable
serializable是java为我们提供的一个标准化的序列化接口。
parcelable是android为我们提供的序列化的接口。
对比:
1、parcelable相对于serializable的使用相对复杂一些。
2、parcelable的效率相对serializable也高很多。
3、parcelable不能使用在要将数据存储在磁盘上的情况,因为parcelable在外界有变化的情况下不能很好的保证数据的持续性。尽管serializable效率低点,但此时还是建议使用serializable。存储到设备或者网络传输上选择serializable。
序列化与反序列化
序列化:将对象转换为可以传输的二进制流(二进制序列)的过程,这样我们就可以通过序列化,转化为可以在网络传输或者保存到本地的流(序列),从而进行传输数据 。
反序列化:从二进制流(序列)转化为对象的过程。
简单使用:
进行android开发的时候,无法将对象的引用传给activities或者fragments,我们需要将这些对象放到一个intent或者bundle里面,然后再传递。简单看一下:
1、定义book类,实现parcelable接口。
package com.status.mattest; import android.os.parcel; import android.os.parcelable; public class book implements parcelable { private string name; private int id; private string classify; protected book(parcel in) { name = in.readstring(); classify = in.readstring(); id = in.readint(); } public book(string classify, string name, int id) { this.name = name; this.id = id; this.classify = classify; } /** * 反序列化 */ public static final creator<book> creator = new creator<book>() { @override public book createfromparcel(parcel in) { return new book(in); } @override public book[] newarray(int size) { return new book[size]; } }; @override public int describecontents() { return 0; } /** * 序列化过程 * * @param dest * @param flags */ @override public void writetoparcel(parcel dest, int flags) { dest.writestring(name); dest.writestring(classify); dest.writeint(id); } @override public string tostring() { return "name : " + name + "\"" + "id : " + id + "\"" + "classify" + classify; } }
writetoparcel:序列化过程
creator与protected book(parcel in)配合实现反序列化,转换为对象。
注意:类中有多个string或者其它相同对象的话,那么writetoparcel中writestring的顺序是怎么样的,protected book(parcel in) {}中readstring的顺序就得是怎么样的。
2、mainactivity中:
textview.setonclicklistener(new view.onclicklistener() { @override public void onclick(view v) { intent intent = new intent(mainactivity.this, test1activity.class); intent.putextra("key", new book("哈", "鸿", 8)); startactivity(intent); } });
3、另一个activity获取:
intent intent = getintent(); book book = intent.getparcelableextra("key"); log.d("test1activity", book.tostring());
输出:
--------------------------------------------------------------------------------
book类里面有其它对象:
如果book类里面有其他对象(比如实体类data)的话,那么data也需要实现parcelable接口,用法与上面的book类一样。
writetoparcel里面需要写上:dest.writeparcelable(data, 0);
protected book(parcel in) {}
里面需要写上data = in.readparcelable(data.class.getclassloader());
总结
以上所述是小编给大家介绍的android中parcelable的使用详解,希望对大家有所帮助