标签:
1)为什么要实现Parfcelable接口来实现在Intent中传递对象?
a、在使用内存的时候,Parcelable比Serializable性能高,所以推荐使用Parcelable类。
b、Serializable在序列化的时候会产生大量的临时变量,从而引起频繁的GC。
注意:Parcelable不能使用在将数据存储在磁盘上的情况,因为Parcelable不能很好的保存数据的持续性在外界有变化的情况下。因此在这种情况下,建议使用Serializable
1、作用
Serializable的作用是为了保存对象的属性到本地文件、数据库、网络流、rmi以方便数据传输,当然这种传输可以是程序内的也可以是两个程序间的。而Android的Parcelable的设计初衷是因为Serializable效率过慢,为了在程序内不同组件间以及不同Android程序间(AIDL)高效的传输数据而设计,这些数据仅在内存中存在,Parcelable是通过IBinder通信的消息的载体。
从上面的设计上我们就可以看出优劣了。
2、效率及选择
Parcelable的性能比Serializable好,在内存开销方面较小,所以在内存间数据传输时推荐使用Parcelable,如activity间传输数据,而Serializable可将数据持久化方便保存,所以在需要保存或网络传输数据时选择Serializable,因为android不同版本Parcelable可能不同,所以不推荐使用Parcelable进行数据持久化
应用:
Serializable 代码
package com.weidingqiang.customnetroid; import java.io.Serializable; /** * Created by weidingqiang on 15/12/5. */ public class SDownVO implements Serializable { private String url; private String name; private boolean isdown; private int percent; public SDownVO(String url,String name,boolean isdown,int percent){ this.isdown = isdown; this.url = url; this.name = name; this.percent =percent; } public String getUrl() { return url; } public String getName() { return name; } public boolean isdown() { return isdown; } public int getPercent() { return percent; } }
传参
List<SDownVO> list = new ArrayList<SDownVO>(); list.add(new SDownVO("www.baidu.com", "百度", false, 100)); Bundle bundle = new Bundle(); bundle.putInt("Flag", 0); bundle.putSerializable("start1", (Serializable) list); intent.putExtra("bundle",bundle);
获取
List<SDownVO> list = (List<SDownVO>) bundle.getSerializable("start1");
list.size();
Parcelable 代码
package com.weidingqiang.customnetroid; import android.os.Parcel; import android.os.Parcelable; /** * Created by weidingqiang on 15/12/5. */ public class PDownVO implements Parcelable { private String url; private String name; private boolean isdown; private int percent; public PDownVO(){ } public PDownVO(String url,String name,boolean isdown,int percent){ this.isdown = isdown; this.url = url; this.name = name; this.percent =percent; } public String getUrl() { return url; } public String getName() { return name; } public boolean isdown() { return isdown; } public int getPercent() { return percent; } @Override public int describeContents() { return 0; } @Override public void writeToParcel(Parcel dest, int flags) { dest.writeString(name); dest.writeString(url); dest.writeInt(percent); dest.writeByte((byte) (isdown ? 1 : 0)); } public static final Parcelable.Creator<PDownVO> CREATOR = new Creator<PDownVO>() { //实现从source中创建出类的实例的功能 @Override public PDownVO createFromParcel(Parcel source) { PDownVO parInfo = new PDownVO(); parInfo.name = source.readString(); parInfo.url= source.readString(); parInfo.percent = source.readInt(); parInfo.isdown = (source.readByte()!=0); return parInfo; } //创建一个类型为T,长度为size的数组 @Override public PDownVO[] newArray(int size) { return new PDownVO[size]; } }; }
传参
ArrayList<PDownVO> list1 = new ArrayList<PDownVO>(); list1.add(new PDownVO("www.baidu.com", "百度", false, 100)); Bundle bundle1 = new Bundle(); bundle1.putInt("Flag", 1); bundle1.putParcelableArrayList("start2", list1); intent.putExtra("bundle",bundle1);
获取
ArrayList<PDownVO> list1 = bundle.getParcelableArrayList("start2");
list1.size();
Android Parcelable和Serializable的区别
标签:
原文地址:http://www.cnblogs.com/weidingqiang/p/5021347.html