Android中传递对象的三种方法
Android知识、前端、后端以至于产品和设计都有涉猎,想成为全栈工程师的朋友不要错过!
Android中,Activity和Fragment之间传递对象,可以通过将对象序列化并存入Bundle或者Intent中进行传递,也可以将对象转化为JSON字符串,进行传递。
序列化对象可以使用Java的Serializable
的接口、Parcelable
接口。转化成JSON字符串,可以使用Gson
等库。
1.Serializable
Model
- public class Author implements Serializable{
- private int id;
- private String name;
- //...
- }
- public class Book implements Serializable{
- private String title;
- private Author author;
- //...
- }
传递数据
- Book book=new Book();
- book.setTitle("Java编程思想");
- Author author=new Author();
- author.setId(1);
- author.setName("Bruce Eckel");
- book.setAuthor(author);
- Intent intent=new Intent(this,SecondActivity.class);
- intent.putExtra("book",book);
- startActivity(intent);
接收数据
- Book book= (Book) getIntent().getSerializableExtra("book");
- Log.d(TAG,"book title->"+book.getTitle());
- Log.d(TAG,"book author name->"+book.getAuthor().getName());
2.转化为JSON字符串
Model
- public class Author{
- private int id;
- private String name;
- //...
- }
- public class Book{
- private String title;
- private Author author;
- //...
- }
传递数据
- Book book=new Book();
- book.setTitle("Java编程思想");
- Author author=new Author();
- author.setId(1);
- author.setName("Bruce Eckel");
- book.setAuthor(author);
- Intent intent=new Intent(this,SecondActivity.class);
- intent.putExtra("book",new Gson().toJson(book));
- startActivity(intent);
接收数据
- String bookJson=getIntent().getStringExtra("book");
- Book book=new Gson().fromJson(bookJson,Book.class);
- Log.d(TAG,"book title->"+book.getTitle());
- Log.d(TAG,"book author name->"+book.getAuthor().getName());
3.使用Parcelable
实现Parcelable
接口需要实现两个方法
describeContents方法。内容接口描述,默认返回0就可以;
writeToParcel方法。将传递的数据打包到Parcel容器中。
除了要实现这两个方法还必须创建一个Parcelable.Creator
接口的实例,用于读取Parcel容器中的数据
Model
- public class Author implements Parcelable{
- private int id;
- private String name;
- //setter & getter...
- @Override
- public int describeContents() {
- return 0;
- }
- @Override
- public void writeToParcel(Parcel dest, int flags) {
- //该方法将类的数据写入外部提供的Parcel中.即打包需要传递的数据到Parcel容器保存,
- // 以便从parcel容器获取数据
- dest.writeString(name);
- dest.writeInt(id);
- }
- public static final Creator<Author> CREATOR=new Creator<Author>() {
- @Override
- public Author createFromParcel(Parcel source) {
- //从Parcel容器中读取传递数据值,封装成Parcelable对象返回逻辑层。
- Author author=new Author();
- author.setName(source.readString());
- author.setId(source.readInt());
- return author;
- }
- @Override
- public Author[] newArray(int size) {
- //创建一个类型为T,长度为size的数组,仅一句话(return new T[size])即可。方法是供外部类反序列化本类数组使用。
- return new Author[size];
- }
- };
- }
- public class Book implements Parcelable{
- private String title;
- private Author author;
- //setter & getter...
- @Override
- public int describeContents() {
- return 0;
- }
- @Override
- public void writeToParcel(Parcel dest, int flags) {
- dest.writeString(title);
- dest.writeParcelable(author,flags);
- }
- public static final Creator<Book> CREATOR=new Creator<Book>() {
- @Override
- public Book createFromParcel(Parcel source) {
- Book book=new Book();
- book.setTitle(source.readString());
- book.setAuthor(source.<Author>readParcelable(Author.class.getClassLoader()));
- return book;
- }
- @Override
- public Book[] newArray(int size) {
- return new Book[0];
- }
- };
- }
传递数据
- Book book=new Book();
- book.setTitle("Java编程思想");
- Author author=new Author();
- author.setId(1);
- author.setName("Bruce Eckel");
- book.setAuthor(author);
- Intent intent=new Intent(this,SecondActivity.class);
- intent.putExtra("book",book);
- startActivity(intent);
接收数据
- Book book=getIntent().getParcelableExtra("book");
- Log.d(TAG,"book title->"+book.getTitle());
- Log.d(TAG,"book author name->"+book.getAuthor().getName());
4.性能分析
经过测试,我们得到下图的效果
可以看出,通过转换为字符串的速度是最慢的。Seralizable次之,Parcelable比Seralizable快10倍。所以从性能上考 虑,我们必定优先选择Parcelable。但是Parcelable有大量重复的模板代码,如何简化这些操作,将是下面主要讲解的内容。
5.简化Parcel操作
如果你使用android Studio 可以通过安装android-parcelable-intellij-plugin插件,或者自己配置模板进行操作。
5.1 parceler
除了上面的操作,还有大量的第三方库来简化Parcelable操作。当然使用这些库也许会降低Parcelable的性能。Parceler就是这样一个库。
Parceler使用非常简单,在定义Model时用@Parcel
进行注解,在传递数据的时候使用Parcels
的wrap
方法来包装成一个Parcelable
对象。获取数据时用Parcels
的unwrap
方法来获取对象。
Model
- @Parcel
- public class Author {
- int id;
- String name;
- //setter & getter...
- }
- @Parcel
- public class Book {
- String title;
- Author author;
- //setter & getter
- }
传递对象
- Book book=new Book();
- book.setTitle("Java编程思想");
- Author author=new Author();
- author.setId(1);
- author.setName("Bruce Eckel");
- book.setAuthor(author);
- Intent intent=new Intent(this,SecondActivity.class);
- intent.putExtra("book", Parcels.wrap(book));
- startActivity(intent);
接收对象
- Book book= Parcels.unwrap(getIntent().getParcelableExtra("book"));
- Log.d(TAG,"book title->"+book.getTitle());
- Log.d(TAG,"book author name->"+book.getAuthor().getName());
除了Parceler之外,还有如auto-parcel,ParcelableCodeGenerator,ParcelableGenerator等第三方库,这里我将不进行讲解,有兴趣的朋友,可以自行研究。
Android中传递对象的三种方法的更多相关文章
- mfc 在VC的两个对话框类中传递参数的三种方法
弄了好久,今天终于把在VC中的对话框类之间传递参数的问题解决了,很开心,记录如下: 1. 我所建立的工程是一个基于MFC对话框的应用程序,一共有三个对话框,第一个对话框为主对话框,所对应的类为CTMD ...
- URL转Drawable之 Android中获取网络图片的三种方法
转载自: http://doinone.iteye.com/blog/1074283 Android中获取网络图片是一件耗时的操作,如果直接获取有可能会出现应用程序无响应(ANR:Applicatio ...
- Android中全屏 取消标题栏,TabHost中设置NoTitleBar的三种方法(转)
Android中全屏 取消标题栏,TabHost中设置NoTitleBar的三种方法http://www.cnblogs.com/zdz8207/archive/2013/02/27/android- ...
- android中解析文件的三种方式
android中解析文件的三种方式 好久没有动手写点东西了,最近在研究android的相关技术,现在就android中解析文件的三种方式做以下总结.其主要有:SAX(Simple API fo ...
- jQuery中detach&&remove&&empty三种方法的区别
jQuery中empty&&remove&&detach三种方法的区别 empty():移除指定元素内部的所有内容,但不包括它本身 remove():移除指定元素内部的 ...
- Hibernate中Java对象的三种状态
Hibernate中Java对象的三种 ...
- javascript生成对象的三种方法
/** js生成对象的三种方法*/ // 1.通过new Object,然后添加属性 示例如下: var people1 = new Object(); people1.name = 'xiaohai ...
- Openerp 中打开 URL 的三种 方法
来自:http://shine-it.net/index.php/topic,8013.0.html 最近总结了,Openerp 中打开 URL 的三种 方法: 一.在form view 添加 < ...
- mysql 中添加索引的三种方法
原文:http://www.andyqian.com/2016/04/06/database/mysqleindex/ 在mysql中有多种索引,有普通索引,全文索引,唯一索引,多列索引,小伙伴们可以 ...
随机推荐
- Moebius for SQLServer负载均衡
搞数据库的都知道:在Oracle上有RAC集群,MySQL也有对应的方案,而SQL Server上直到SQL Server 2012版本的AlwaysOn到来,微软都没有提供一个负载均衡方案,在网上看 ...
- OI Journal
佛系更新,哪天想起来就写点. 10.11 班主任硬灌的鸡汤真香 qtmd,简直就是硬扯,说怎么怎么着说不定就能多拿一分两分,一分两分就能割掉好多人 ......螺旋懵圈状,我表示硬憋着不笑 HIAHI ...
- FastNet C++/Python 网络通信库之 协议
协议可以使用的基础数据类型: UInt8,UInt16,UInt32,UInt64Int8,Int16,Int32,Int64Float,Double,Bool,String [T] 数组,T代表元 ...
- MySQL redo log 与 binlog 的区别
MySQL redo log 与 binlog 的区别 什么是redo log 什么是binlog redo log与binlog的区别 1. 什么是redo log? redo log又称重做日志文 ...
- BERT模型介绍
前不久,谷歌AI团队新发布的BERT模型,在NLP业内引起巨大反响,认为是NLP领域里程碑式的进步.BERT模型在机器阅读理解顶级水平测试SQuAD1.1中表现出惊人的成绩:全部两个衡量指标上全面超越 ...
- Python进阶之网络编程
网络通信 使用网络的目的 把多方链接在一起,进行数据传递: 网络编程就是,让不同电脑上的软件进行数据传递,即进程间通信: ip地址 ip地址概念和作用 IP地址是什么:比如192.168.1.1 这样 ...
- 剑指Offer(书):二进制中1的个数
题目:输入一个整数,输出该数二进制表示中1的个数.其中负数用补码表示. 分析:下面这两种方法都可以,不过第二种更好一些. public int numberOf1(int n) { int count ...
- 【HDU 3037】Saving Beans(卢卡斯模板)
Problem Description Although winter is far away, squirrels have to work day and night to save beans. ...
- hadoop格式化出错,提示IO异常
配置好hadoop之后,在进行格式化的时候出现异常,原因是由于在core-site.xml 配置文件中写的路径格式不对. 不需要加 file:/ 或者 file:// 直接写绝对路径就行. <c ...
- 什么是slug URL 中的 slug
How would you reference this object with a URL, with a meaningful name? You could use Article.id so ...