Parcelable的使用

        Android里为了提高序列化效率,提高了一个类似于java原生的Serializable的序列化接口——Parcelable。

         下面就来详细说说这个Parcelable接口:

 

        1.为什么要进行序列化?

           1)永久性的保存对象,将对象序列化到文件中;

           2)通过序列化对象在网络中传递数据;

           3)通过序列化在进程中传递数据;

 

       2.Android中实现序列化的方法

            Android中实现序列化有两个选择:一是实现Serializable接口(是Java本身就支持的),一是实现Parcelable接口(是Android特有功能,效率比实现Serializable接口高效,可用于Intent数据传递,也可以用于进程间通信(IPC))。实现Serializable接口非常简单,声明一下就可以了,而实现Parcelable接口稍微复杂一些,但效率更高,推荐用这种方法提高性能。

             注:AndroidIntent传递对象有两种方法:一是Bundle.putSerializable(KeyObject),另一种是Bundle.putParcelable(KeyObject)。当然这些Object是有一定的条件的,前者是实现了Serializable接口,而后者是实现了Parcelable接口。

   

        3.选择序列化方法的原则

            1)在内存中使用的时候,Parcelable比Serializable性能要高,推荐使用Parcelable;

            2)Serializable在序列化的时候会产生大量的临时变量,从而引起频繁的GC;

            3)Parcelable不能使用在要将数据存储在磁盘上的情况,因为Parcelable不能很好的保证数据的持续性在外界有变化的情况下。尽管Serializable效率低点,但此时还是建议使用Serializable

 

        4.使用场景
               需要在多个部件 (Activity Service) 之间通过 Intent 传递一些数据,简单类型(如:数字、字符串)的可以直接放入 Intent 。复杂类型必须实现 Parcelable 接口。         
       5.使用详解:
             1)定义序列化实体类:
             
import android.os.Parcel;
import android.os.Parcelable;


/** 
 *  实现Parcelable接口
 */
public class Entity implements Parcelable {
	
	private int id;
	private String name;

	public Entity(int id, String name) {
		this.id = id;
		this.name = name;
	}

	public Entity(Parcel in) {
		this.id = in.readInt();
		this.name = in.readString();
	}

	public int getId() {
		return id;
	}

	public void setId(int id) {
		this.id = id;
	}

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}
	
   //默认返回"0"就行
	@Override
	public int describeContents() {
		return 0;
	}

	//将对象数据写入到Parcel对象中,如intent.putExtra("Parcel", entity)将调用
	@Override
	public void writeToParcel(Parcel dest, int flags) {
		dest.writeInt(id);
		dest.writeString(name);

	}
	
	//定义Parcelable.Creator内部类,注意:类名只能为CREATOR,全大写,不能为小写         //或者其他名
	//public static final 这些修饰符一个都不能少
	public static final Parcelable.Creator<Entity> CREATOR= new Parcelable.Creator<Entity>() {

		//反序列将调用该方法还原,如Entity entity = (Entity)intent.getPa                //rcelableExtra("Parcel")将调用该方法
		@Override
		public Entity createFromParcel(Parcel source) {
			return new Entity(source);
		}
		
		//默认返回new Entity[size]就行
		@Override
		public Entity[] newArray(int size) {
			return new Entity[size];
		}
	};

}
           2) 传递数据          

          3)获取数据
              

 
        6 .使用Parcelable进行对象传递的原理解析  
            1)当我们调用 intent .putExtra( "Parcel" , entity );时会entity对象写入到一个Parcel对象中  ,调转到 ParcelResultActivity后再从Parcel对象中将entity对象还原 Entity entity = (Entity) intent . getParcelableExtra ( "Parcel" );
          2)上面提到两个关键字:写入和还原;上面的  Entity entity = (Entity) intent .getParcelableExtra     ( "Parcel" )就是写入操作,而静态内部类CREATOR中的 public Entity createFromParcel(Parcel source) {就是还原操作;
     3) 当有Parcelable对象也可以通过IPC传递

 

 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值