Android中Parcelable接口用法

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接口。

6Parcelable接口定义

复制代码
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();}}
复制代码

8Serializable实现与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;}@Overridepublic int describeContents(){return 0;}@Overridepublic 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>(){@Overridepublic Book[] newArray(int size){return new Book[size];}@Overridepublic Book createFromParcel(Parcel in){return new Book(in);}};public Book(Parcel in){bookName = in.readString();author = in.readString();publishDate = in.readInt();}
}
复制代码

转载于:https://www.cnblogs.com/qingchen1984/p/5053976.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/491462.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

python获取当前文件路径

路径包含文件名&#xff1a; import sys print(sys.argv[0]) 输出/***/***/***.py 路径不包含文件名&#xff1a; 以下三种方式输出的结果一样 import os print(os.getcwd()) print(os.path.abspath(.)) print(os.path.abspath(os.curdir)) 输出/***/***/***

顶级专家谈中国脑科学研究最新成果

来源&#xff1a;环球时报大脑是人体最复杂的器官&#xff0c;人类对它的构造与运作机制充满好奇&#xff0c;但至今仍有大量难题需要破解。6月18日&#xff0c; 由中国科学院自动化研究所主办、自动化所脑网络组研究中心——中科搏锐团队承办的“中国科学院自动化研究所脑科学…

VMware虚拟机的三种联网方法及原理

VMware虚拟机的三种联网方法及原理 博客分类&#xff1a; 操作系统 虚拟机Vmware互联网网络应用网络协议 一、Brigde——桥接 &#xff1a;默认使用VMnet0 1、原理&#xff1a; Bridge 桥"就是一个主机&#xff0c;这个机器拥有两块网卡&#xff0c;分别处于两个局域…

[iOS]深度遍历view的subview

情景: cell中有textfield, 现在需要在tableview滚动是取消所有的textfield的第一响应, 一个个写比较麻烦, 写了一个递归方法, 用来遍历所有的子视图. -(void)allView:(UIView *)rootView {for (UIView *subView in [rootView subviews]){if (!rootView.subviews.count) {return…

量化人类社会交互行为

利用虚拟现实技术对人类社会交互行为进行定量化测量的过程 图片来源&#xff1a;蒯曙光团队来源&#xff1a; 中国科学报清早&#xff0c;小明走进教室&#xff0c;发现同学们正在聊天&#xff0c;老师敲黑板试图引起学生们的注意&#xff0c;李雷和韩梅梅明白了老师的意图&a…

如何在A用户下建立视图,这个视图是A的表与B的表进行关联的?

这个前提条件是&#xff0c;同一个数据库&#xff0c;不同用户&#xff01;&#xff01;&#xff01;如果是不同数据库&#xff0c;就要用dblink了 一开始&#xff0c;我直接创建视图&#xff0c;但是提示“权限不足”&#xff1b; 于是我是用A登陆&#xff0c;直接用select * …

VMware14.1 Ubuntu16.04安装教程

1. 安装WMware14.1&#xff0c;安装成功后打开点击“主页”中的“创建新的虚拟机”。 2. 选择“自定义”&#xff0c;点击“下一步” 3. 选择默认选项&#xff0c;点击“下一步”。 4. 选择“稍后安装操作系统”&#xff0c;点击“下一步”。 5. 根据自己的实际情况进行选择&am…

python生成和导入pyc文件

生成pyc文件&#xff1a; import compileall compileall.compile_dir("/file_path") /file_path文件夹包含了所有要生成pyc格式的py文件 运行完后会在/file_path下生成一个__pycache__目录&#xff0c;存放所有生成的的pyc文件 导入pyc文件&#xff1a; 生成的p…

17个机器学习的常用算法!

来源&#xff1a;AI干货知识库根据数据类型的不同&#xff0c;对一个问题的建模有不同的方式。在机器学习或者人工智能领域&#xff0c;人们首先会考虑算法的学习方式。在机器学习领域&#xff0c;有几种主要的学习方式。将算法按照学习方式分类是一个不错的想法&#xff0c;这…

python获取依赖包和安装依赖包

获取依赖包&#xff1a; 第一种方法&#xff1a;获取环境中所有安装的包 打开命令提示符&#xff0c;在某条路径下输入pip freeze > ./requirements.txt 这时就会生成一个requirements.txt文件 第二种方法&#xff1a;根据某一个项目的import语句来生成依赖 打开命令提…

Firefox Developer Edition已阻止此网站安装未经验证的附加组件的解决办法

火狐浏览器添加博客园网摘&#xff0c;遇到这样一个问题&#xff1a;Firefox Developer Edition已阻止此网站安装未经验证的附加组件。 网上搜到的解决办法简明扼要&#xff0c;就这一句&#xff1a;about:config 中 xpinstall.signatures.required 设置为false. 我的补充&…

将联网方式更改为桥接模式

当前联网方式为NAT&#xff0c;当我们需要搭集群时需要我们将其改为桥接模式&#xff0c;下面将介绍如何更改连接方式。 1. 点击VMware上菜单栏里的虚拟机&#xff0c;点击“设置”&#xff0c;在弹出框内进行如下设置&#xff0c;点击“确定”。 2. 打开终端&#xff0c;输入…

有关军事人机混合智能的再再思考

来源&#xff1a; 人机与认知实验室【军事智能研究是一个领域&#xff0c;不是一个学科&#xff0c;我们必须要用不同的方法论&#xff0c;从不同的角度来研究游戏&#xff0c;方法论、角度越多&#xff0c;军事智能研究就会做得越好。】军事智能是一种涉及感性&#xff08;尤其…

设置numpy的随机种子

np.random.random([])可以生成随机数矩阵&#xff0c;有时候我们想每次生成的随机数矩阵都一样&#xff0c;这时只需在前面加一句 np.random.seed(0)即可&#xff0c;如&#xff1a; np.random.seed(0) anp.random.random([2,2]) 当然&#xff0c;随机种子不一定为0&#xf…

查看Oracle有哪些表或者视图

转自&#xff1a;http://www.2cto.com/database/201211/167577.html1、查询当前用户下,有哪些表Sql代码 SELECT * FROM user_tables www.2cto.com 2、查询当前用户下, 可以访问哪些表 [也就是访问自己 和 其他用户的]Sql代码 SELECT * FROM all_tables 3、查询当前数据库所…

VMware14.1 Ubuntu16.04设置xshell连接虚拟机

1. 打开终端&#xff0c;查看本地ip地址 2. 安装ssh 3. 安装ssh成功后&#xff0c;打开本地xshell软件&#xff0c;创建新的会话。输入信息后点击“确定”&#xff0c;此处主机指的是虚拟机主机的ip&#xff0c;即刚刚用ifconfig命令查询到的IP地址。 4. 双击该会话连接&#x…

sklearn.decomposition.FastICA实现FastICA算法

关于sklearn.decomposition.FastICA的介绍http://lijiancheng0614.github.io/scikit-learn/modules/generated/sklearn.decomposition.FastICA.html import numpy as np import matplotlib.pyplot as plt from sklearn.decomposition import FastICAC 200 # 样本数 x np.ar…

四大运营商的5G部署路线一览

来源&#xff1a;数据观综合报道6月6日&#xff0c;工信部正式向中国移动、中国电信、中国联通和中国广电发放5G商用牌照。至此&#xff0c;中国成为继韩国、美国、瑞士、英国之后&#xff0c;全球第五个开通5G服务的国家。自2016年启动5G试验以来&#xff0c;短短两年时间&…

Ubuntu16.04安装JDK1.8

1. 首先将jdk文件拖拽到虚拟机桌面位置&#xff0c;使用VMware的可以安装高级工具Tools&#xff0c;这样可以实现文件的拖拽。如果没有Tools&#xff0c;也可以使用xftp软件进行文件传输&#xff0c;在此不做具体介绍。 2. 切换到文件所在目录&#xff0c;并将jdk文件移动到安…

hibernate映射-单向n-n关联关系

&#xff08;学习记录&#xff0c;错误不足之处&#xff0c;请您耐心指正^_^&#xff09; hibernate映射-多对多关联关系 n-n关联必须使用连接表才能完成&#xff0c; 一、代码示例&#xff1a; {类文件↓} Category.class 1 package com.zit.hibernate.n2n;2 3 import java.ut…