• Android中Parcelable接口的使用


      在做开发的过程中,序列化是非常常见的。比如要将对象保存本地磁盘或者在网络上传输等。实现序列化有两种方式,一种是实现Serializable接口,第二种是实现Parcelable。

    Serializable与Parcelable的区别

      1、Serializable是JDK提供的接口,而Parcelable是Android SDK提供的。

      2、Serializable序列化是基于磁盘的,而Parcelable是基于内存的。在内存中读写肯定效率要高于磁盘,所以Android中跨进程传递对象都是使用Parcelable。

    Parcelable接口定义

     1 public interface Parcelable {
     2     //内容描述接口,基本不用管
     3     public int describeContents();
     4     //写入接口函数,打包
     5     public void writeToParcel(Parcel dest, int flags);
     6      //读取接口,目的是要从Parcel中构造一个实现了Parcelable的类的实例处理。因为实现类在这里还是不可知的,所以需要用到模板的方式,继承类名通过模板参数传入。
     7     //为了能够实现模板参数的传入,这里定义Creator嵌入接口,内含两个接口函数分别返回单个和多个继承类实例。
     8     public interface Creator<T> {
     9            public T createFromParcel(Parcel source);
    10            public T[] newArray(int size);
    11        }

      从parcelable接口定义中,我们可以看到,实现parcelable接口,需要我们实现下面几个方法:

         1.describeContents方法。内容接口描述,默认返回0就可以;

         2.writeToParcel 方法。该方法将类的数据写入外部提供的Parcel中.即打包需要传递的数据到Parcel容器保存,以便从parcel容器获取数据,该方法声明如下:

            writeToParcel (Parcel dest, int flags) 具体参数含义见javadoc

         3.静态的Parcelable.Creator接口,本接口有两个方法:

            createFromParcel(Parcel in)  从Parcel容器中读取传递数据值,封装成Parcelable对象返回逻辑层。

            newArray(int size) 创建一个类型为T,长度为size的数组,仅一句话(return new T[size])即可。方法是供外部类反序列化本类数组使用。

    Parcelable的使用

     1 public class AppContent implements Serializable, Parcelable {
     2     //应用名字
     3     private String name;
     4     //应用下载链接
     5     private String url;
     6 
     7     private int downloadPercent = 0;
     8 
     9     private Status status = Status.PENDING;
    10 
    11     public AppContent(String name, String url) {
    12         this.name = name;
    13         this.url = url;
    14     }
    15 
    16     public String getName() {
    17         return name;
    18     }
    19 
    20     public void setName(String name) {
    21         this.name = name;
    22     }
    23 
    24     public String getUrl() {
    25         return url;
    26     }
    27 
    28     public void setUrl(String url) {
    29         this.url = url;
    30     }
    31 
    32     public int getDownloadPercent() {
    33         return downloadPercent;
    34     }
    35 
    36     public void setDownloadPercent(int downloadPercent) {
    37         this.downloadPercent = downloadPercent;
    38     }
    39 
    40     public Status getStatus() {
    41         return status;
    42     }
    43 
    44     public void setStatus(Status status) {
    45         this.status = status;
    46     }
    47 
    48     @Override
    49     public String toString() {
    50         return name;
    51     }
    52 
    53     @Override
    54     public int describeContents() {
    55         return 0;
    56     }
    57 
    58     //实现Parcel接口必须覆盖实现的方法
    59     @Override
    60     public void writeToParcel(Parcel dest, int flags) {
    61         /*将AppContent的成员写入Parcel,
    62          * 注:Parcel中的数据是按顺序写入和读取的,即先被写入的就会先被读取出来
    63          */
    64         dest.writeString(name);
    65         dest.writeString(url);
    66         dest.writeInt(downloadPercent);
    67         dest.writeValue(status);
    68     }
    69 
    70     //该静态域是必须要有的,而且名字必须是CREATOR,否则会出错
    71     public static final Parcelable.Creator<AppContent> CREATOR =
    72             new Parcelable.Creator<AppContent>() {
    73 
    74                 @Override
    75                 public AppContent createFromParcel(Parcel source) {
    76                     //从Parcel读取通过writeToParcel方法写入的AppContent的相关成员信息
    77                     String name = source.readString();
    78                     String url = source.readString();
    79                     int downloadPercent = source.readInt();
    80                     Status status = (Status)source.readValue(new ClassLoader(){});
    81                     AppContent appContent = new AppContent(name, url);
    82                     appContent.setDownloadPercent(downloadPercent);
    83                     appContent.setStatus(status);
    84                     //更加读取到的信息,创建返回Person对象
    85                     return appContent;
    86                 }
    87 
    88                 @Override
    89                 public AppContent[] newArray(int size)
    90                 {
    91                     // TODO Auto-generated method stub
    92                     //返回AppContent对象数组
    93                     return new AppContent[size];
    94                 }
    95             };
    96 
    97 }

      通过Intent进行传递:

    1    Intent intent = new Intent(Constants.DOWNLOAD_MSG);
    2    Bundle bundle = new Bundle();
    3    bundle.putParcelable("appContent", appContent);
    4    intent.putExtras(bundle);

      参考:http://www.tuicool.com/articles/MJzAZn,感谢作者。

  • 相关阅读:
    关于Design Complier/Library Compiler的跌坑(坑爹)记录
    博客暂时停更
    简单的Verilog测试模板结构
    存储器的设计/建模
    静态时序分析的三种分析模式(简述)
    Linux系统的基本使用
    Modelsim的使用——复杂的仿真
    Python-第三方库requests
    MySQL查询结果写入到文件总结
    MySQL创建函数报“ERROR 1418 ”错误,不能创建函数
  • 原文地址:https://www.cnblogs.com/liuling/p/2015-10-14-01.html
Copyright © 2020-2023  润新知