当前位置: 移动技术网 > IT编程>移动开发>Android > Android Parcelable接口使用方法详解

Android Parcelable接口使用方法详解

2019年07月24日  | 移动技术网IT编程  | 我要评论

李智楠快乐大本营,魔力星际,人面桃花刘海波

 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接口的使用方法,如有疑问请留言或者到本站社区交流讨论,感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!

如对本文有疑问,请在下面进行留言讨论,广大热心网友会与你互动!! 点击进行留言回复

相关文章:

验证码:
移动技术网