Parcelable的简单说明

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档


提示:以下是本篇文章正文内容,下面案例可供参考

一、Parcelable是什么?

Parcelable是Android中的一个接口,它允许对象可以被序列化,以便在不同的组件之间传递。
当一个类实现Parcelable接口后,它就可以被轻松地传递给其他组件。

二、使用步骤

  • 简单说明:

要实现Parcelable接口,我们需要实现三个方法:describeContents()、writeToParcel()和createFromParcel()
describeContents()方法用于返回当前对象的类型和数据类型,该方法除了当前对象存在文件描述符的时候,需要返回“1”,其他情况基本返回“0”
writeToParcel()方法用于将对象的数据写入Parcel对象
createFromParcel()方法用于从Parcel对象中创建原始对象。

  • 补充:文件描述符

android系统是基于Linux操作系统的,故在Linux操作系统中,当一个应用程序进程操作系统资源时,首先会触发文件调用事件,通过应用程序或进程发送一个调用文件的信号操作系统内核内核会在 打开文件表 中增加一条记录,同时将 新增的记录 返回给应用程序或进程,而应用程序或进程接收到来自内核返回的信息,称为 文件描述符(file desrciption)

1.简单说明

代码如下(示例):

//1.先写成员属性,再导入相关数据
public class User implements Parcelable {


    public int userId;
    public String userName;
    public boolean isMale;


    public User(int userId, String userName, boolean isMale) {
        this.userId = userId;
        this.userName = userName;
        this.isMale = isMale;
    }


    /**
     * 从序列化后的对象中创建原始对象
     * @param in
     */
    protected User(Parcel in) {
        userId = in.readInt();
        userName = in.readString();
        isMale = in.readByte() != 0;
    }

    /**
     * 反序列化——内部标明如果创建序列化对象和数组,read方法来完成反序列化过程
     */
    public static final Creator<User> CREATOR = new Creator<User>() {
        //从序列化后的对象创建原始对象
        @Override
        public User createFromParcel(Parcel in) {
            return new User(in);
        }

        //创建指定长度的原始对象数组
        @Override
        public User[] newArray(int size) {
            return new User[size];
        }
    };

    /**
     * 内容描述——除了当前对象存在文件描述符的时候,需要返回“1”。
     * 其他任何情况都返回“0”
     * @return
     */
    @Override
    public int describeContents() {
        return 0;
    }

    /**
     * 序列化功能
     * @param dest 写对象的包裹
     * @param flags 关于如何编写对象的其他标志。
     *              为1的时候标识当前对象需要作为返回值返回,不能立即释放资源,几乎所有情况都为0
     * May be 0 or {@link #PARCELABLE_WRITE_RETURN_VALUE}.
     */
    @Override
    public void writeToParcel(@NonNull Parcel dest, int flags) {
        dest.writeInt(userId);
        dest.writeString(userName);
        dest.writeByte((byte) (isMale ? 1 : 0));
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值