zoukankan      html  css  js  c++  java
  • Android Parcelable接口的使用/序列化数据

    首先,我们要知道Android序列化的方法有两种,一个是实现Serializable,这是JavaSE中就支持的接口,后来google推出了专门针对Android的接口Parcelable(其性能相对Serializable将近快了10倍)

    然后我们要知道Android内部传递实例的基本方法:一是Bundle.putSerializable(Key,Object),另一种是Bundle.putParcelable(Key,Object),它们分别要实现Serializable和Parcelable接口。需要注意的一点是Parcelable不能使用在要将数据存储在磁盘上的情况,因为Parcelable不能很好的保证数据的持续性在外界有变化的情况下。这种情况还是使用Serializable比较好。

    我们先看Parcelable接口的定义:

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

    继承该接口后,我们主要是重写writeToParcel()将数据序列化成一个Parcel对象

    下面是将一个User类实现了Parcelable的具体源码

      1 package com.catvideo.tv.catvideo.com.catvideo.user;
      2 
      3 import android.os.Parcel;
      4 import android.os.Parcelable;
      5 
      6 /**
      7  * @author lcc 957109587@qq.com
      8  * @version 2016��5��31�� ����12:09:20
      9  * @Description
     10  */
     11 public class User implements Parcelable {
     12     int userId;
     13     private String userName;
     14     private String passWord;
     15     private String email;
     16     boolean state;
     17 
     18     public User() {
     19 
     20     }
     21 
     22     public User(String email, String passWord) {
     23         this.email = email;
     24         this.passWord = passWord;
     25     }
     26 
     27     public User(int userId, String userName, String passWord, boolean state) {
     28         this.userId = userId;
     29         this.userName = userName;
     30         this.passWord = passWord;
     31         this.state = state;
     32     }
     33 
     34     public User(int userId, String userName, String passWord) {
     35         this.userId = userId;
     36         this.userName = userName;
     37         this.passWord = passWord;
     38         this.state = false;
     39     }
     40 
     41     public int getUserId() {
     42         return userId;
     43     }
     44 
     45     public void setUserId(int userId) {
     46         this.userId = userId;
     47     }
     48 
     49     public String getUserName() {
     50         return userName;
     51     }
     52 
     53     public void setUserName(String userName) {
     54         this.userName = userName;
     55     }
     56 
     57     public String getPassWord() {
     58         return passWord;
     59     }
     60 
     61     public void setPassWord(String passWord) {
     62         this.passWord = passWord;
     63     }
     64 
     65 
     66     public String getEmail() {
     67         return email;
     68     }
     69 
     70     public void setEmail(String email) {
     71         this.email = email;
     72     }
     73 
     74     public boolean isState() {
     75         return state;
     76     }
     77 
     78     public void setState(boolean state) {
     79         this.state = state;
     80     }
     81 
     82     @Override
     83     public int describeContents() {
     84         return 0;
     85     }
     86 
     87     @Override
     88     public void writeToParcel(Parcel dest, int flags) {
     89         boolean[] states = {state};
     90         dest.writeString(userName);
     91         dest.writeInt(getUserId());
     92         dest.writeBooleanArray(states);
     93     }
     94 
     95 //    public static final Parcelable.Creator<User> CREATOR = new Parcelable.Creator<User>() {
     96 ////重写Creator
     97 //
     98 //        @Override
     99 //        public User createFromParcel(Parcel source) {
    100 //            User user = new User();
    101 ////            user.userName=source.readString()
    102 //
    103 ////            p.map = source.readHashMap(HashMap.class.getClassLoader());
    104 ////            p.name = source.readString();
    105 //            return p;
    106 //        }
    107 //
    108 //        @Override
    109 //        public User[] newArray(int size) {
    110 //            // TODO Auto-generated method stub
    111 //            return null;
    112 //        }
    113 //    };
    114 }

    之后可以这样使用:

    intent.putExtra("user", user);

    或者使用Bundle.putParcelable(Key,Object)

    Serializable实现与Parcelabel实现的区别

    1)Serializable的实现,只需要implements  Serializable 即可,不需要实现任何方法。这只是给对象打了一个标记,系统会自动将其序列化。

    2)Parcelabel的实现,不仅需要implements  Parcelabel,还需要在类中添加一个静态成员变量CREATOR,这个变量需要实现 Parcelable.Creator 接口。

  • 相关阅读:
    loadrunner 录制login(关联 参数化 检查点)
    nmon安装(转)
    理解Load Average做好压力测试
    内存泄漏
    上下文切换
    Jmeter 多台机器产生负载
    Java jvm 原理
    【转】HTML-based script和URL-based script两种脚本录制方式
    cookie模拟
    startUML破解方式
  • 原文地址:https://www.cnblogs.com/Linccy/p/5635815.html
Copyright © 2011-2022 走看看