Android知识、前端、后端以至于产品和设计都有涉猎,想成为全栈工程师的朋友不要错过!

Android中,Activity和Fragment之间传递对象,可以通过将对象序列化并存入Bundle或者Intent中进行传递,也可以将对象转化为JSON字符串,进行传递。

序列化对象可以使用Java的Serializable的接口、Parcelable接口。转化成JSON字符串,可以使用Gson等库。

1.Serializable

Model

  1. public class Author implements Serializable{
  2. private int id;
  3. private String name;
  4. //...
  5. }
  1. public class Book implements Serializable{
  2. private String title;
  3. private Author author;
  4. //...
  5. }

传递数据

  1. Book book=new Book();
  2. book.setTitle("Java编程思想");
  3. Author author=new Author();
  4. author.setId(1);
  5. author.setName("Bruce Eckel");
  6. book.setAuthor(author);
  7. Intent intent=new Intent(this,SecondActivity.class);
  8. intent.putExtra("book",book);
  9. startActivity(intent);

接收数据

  1. Book book= (Book) getIntent().getSerializableExtra("book");
  2. Log.d(TAG,"book title->"+book.getTitle());
  3. Log.d(TAG,"book author name->"+book.getAuthor().getName());

2.转化为JSON字符串

Model

  1. public class Author{
  2. private int id;
  3. private String name;
  4. //...
  5. }
  6. public class Book{
  7. private String title;
  8. private Author author;
  9. //...
  10. }

传递数据

  1. Book book=new Book();
  2. book.setTitle("Java编程思想");
  3. Author author=new Author();
  4. author.setId(1);
  5. author.setName("Bruce Eckel");
  6. book.setAuthor(author);
  7. Intent intent=new Intent(this,SecondActivity.class);
  8. intent.putExtra("book",new Gson().toJson(book));
  9. startActivity(intent);

接收数据

  1. String bookJson=getIntent().getStringExtra("book");
  2. Book book=new Gson().fromJson(bookJson,Book.class);
  3. Log.d(TAG,"book title->"+book.getTitle());
  4. Log.d(TAG,"book author name->"+book.getAuthor().getName());

3.使用Parcelable

实现Parcelable接口需要实现两个方法

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

  • writeToParcel方法。将传递的数据打包到Parcel容器中。

除了要实现这两个方法还必须创建一个Parcelable.Creator接口的实例,用于读取Parcel容器中的数据

Model

  1. public class Author implements Parcelable{
  2. private int id;
  3. private String name;
  4. //setter & getter...
  5. @Override
  6. public int describeContents() {
  7. return 0;
  8. }
  9. @Override
  10. public void writeToParcel(Parcel dest, int flags) {
  11. //该方法将类的数据写入外部提供的Parcel中.即打包需要传递的数据到Parcel容器保存,
  12. // 以便从parcel容器获取数据
  13. dest.writeString(name);
  14. dest.writeInt(id);
  15. }
  16. public static final Creator<Author> CREATOR=new Creator<Author>() {
  17. @Override
  18. public Author createFromParcel(Parcel source) {
  19. //从Parcel容器中读取传递数据值,封装成Parcelable对象返回逻辑层。
  20. Author author=new Author();
  21. author.setName(source.readString());
  22. author.setId(source.readInt());
  23. return author;
  24. }
  25. @Override
  26. public Author[] newArray(int size) {
  27. //创建一个类型为T,长度为size的数组,仅一句话(return new T[size])即可。方法是供外部类反序列化本类数组使用。
  28. return new Author[size];
  29. }
  30. };
  31. }
  1. public class Book implements Parcelable{
  2. private String title;
  3. private Author author;
  4. //setter & getter...
  5. @Override
  6. public int describeContents() {
  7. return 0;
  8. }
  9. @Override
  10. public void writeToParcel(Parcel dest, int flags) {
  11. dest.writeString(title);
  12. dest.writeParcelable(author,flags);
  13. }
  14. public static final Creator<Book> CREATOR=new Creator<Book>() {
  15. @Override
  16. public Book createFromParcel(Parcel source) {
  17. Book book=new Book();
  18. book.setTitle(source.readString());
  19. book.setAuthor(source.<Author>readParcelable(Author.class.getClassLoader()));
  20. return book;
  21. }
  22. @Override
  23. public Book[] newArray(int size) {
  24. return new Book[0];
  25. }
  26. };
  27. }

传递数据

  1. Book book=new Book();
  2. book.setTitle("Java编程思想");
  3. Author author=new Author();
  4. author.setId(1);
  5. author.setName("Bruce Eckel");
  6. book.setAuthor(author);
  7. Intent intent=new Intent(this,SecondActivity.class);
  8. intent.putExtra("book",book);
  9. startActivity(intent);

接收数据

  1. Book book=getIntent().getParcelableExtra("book");
  2. Log.d(TAG,"book title->"+book.getTitle());
  3. 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进行注解,在传递数据的时候使用Parcelswrap方法来包装成一个Parcelable对象。获取数据时用Parcelsunwrap方法来获取对象。

Model

  1. @Parcel
  2. public class Author {
  3. int id;
  4. String name;
  5. //setter & getter...
  6. }
  1. @Parcel
  2. public class Book {
  3. String title;
  4. Author author;
  5. //setter & getter
  6. }

传递对象

  1. Book book=new Book();
  2. book.setTitle("Java编程思想");
  3. Author author=new Author();
  4. author.setId(1);
  5. author.setName("Bruce Eckel");
  6. book.setAuthor(author);
  7. Intent intent=new Intent(this,SecondActivity.class);
  8. intent.putExtra("book", Parcels.wrap(book));
  9. startActivity(intent);

接收对象

  1. Book book= Parcels.unwrap(getIntent().getParcelableExtra("book"));
  2. Log.d(TAG,"book title->"+book.getTitle());
  3. Log.d(TAG,"book author name->"+book.getAuthor().getName());

除了Parceler之外,还有如auto-parcel,ParcelableCodeGenerator,ParcelableGenerator等第三方库,这里我将不进行讲解,有兴趣的朋友,可以自行研究。

Android中传递对象的三种方法的更多相关文章

  1. mfc 在VC的两个对话框类中传递参数的三种方法

    弄了好久,今天终于把在VC中的对话框类之间传递参数的问题解决了,很开心,记录如下: 1. 我所建立的工程是一个基于MFC对话框的应用程序,一共有三个对话框,第一个对话框为主对话框,所对应的类为CTMD ...

  2. URL转Drawable之 Android中获取网络图片的三种方法

    转载自: http://doinone.iteye.com/blog/1074283 Android中获取网络图片是一件耗时的操作,如果直接获取有可能会出现应用程序无响应(ANR:Applicatio ...

  3. Android中全屏 取消标题栏,TabHost中设置NoTitleBar的三种方法(转)

    Android中全屏 取消标题栏,TabHost中设置NoTitleBar的三种方法http://www.cnblogs.com/zdz8207/archive/2013/02/27/android- ...

  4. android中解析文件的三种方式

    android中解析文件的三种方式     好久没有动手写点东西了,最近在研究android的相关技术,现在就android中解析文件的三种方式做以下总结.其主要有:SAX(Simple API fo ...

  5. jQuery中detach&&remove&&empty三种方法的区别

    jQuery中empty&&remove&&detach三种方法的区别 empty():移除指定元素内部的所有内容,但不包括它本身 remove():移除指定元素内部的 ...

  6. Hibernate中Java对象的三种状态

                                                                                     Hibernate中Java对象的三种 ...

  7. javascript生成对象的三种方法

    /** js生成对象的三种方法*/ // 1.通过new Object,然后添加属性 示例如下: var people1 = new Object(); people1.name = 'xiaohai ...

  8. Openerp 中打开 URL 的三种 方法

    来自:http://shine-it.net/index.php/topic,8013.0.html 最近总结了,Openerp 中打开 URL 的三种 方法: 一.在form view 添加 < ...

  9. mysql 中添加索引的三种方法

    原文:http://www.andyqian.com/2016/04/06/database/mysqleindex/ 在mysql中有多种索引,有普通索引,全文索引,唯一索引,多列索引,小伙伴们可以 ...

随机推荐

  1. python导包一不小心就入坑(常用解决办法)

    常见导包报错: - ImportError:No module named - SystemError: Parent module '' not loaded, cannot perform rel ...

  2. Windows 7桌面显示图标窗口句柄的获取

    在windows XP时代,我们获取桌面图标窗口的句柄往往用一下语句: HWND hwndParent = ::FindWindow( "Progman", "Progr ...

  3. Linux环境下挂载SD卡的教程

    1.插入SD卡 如果系统能够识别SD卡,则会打印一些信息: 2.查看系统给SD卡分配的设备名 命令如下: fdisk -l 命令 说明:通常是根据SD卡的存储容量来确定的. 比如下面的信息: 3.挂载 ...

  4. bzoj2588 counting on a tree

    题目不难,树上可持久化数据结构. 帖代码: #include<cstdio> #include<algorithm> using namespace std; #define ...

  5. 13. OPTIMIZER_TRACE

    13. OPTIMIZER_TRACE OPTIMIZER_TRACE表提供由跟踪语句的优化程序跟踪功能生成的信息. 要启用跟踪,请使用optimizer_trace系统变量. 有关详细信息,请参阅M ...

  6. mysql中使用load data infile导入数据的用法

    有时需要将大量数据批量写入数据库,直接使用程序语言和Sql写入往往很耗时间,其中有一种方案就是使用mysql load data infile导入文件的形式导入数据,这样可大大缩短数据导入时间. LO ...

  7. 年华利率n%

    年化利率12%指的是,在您出借的本金不减少的情况下,您一年后的利息将达到您出借本金的12%.也就是说,如果年化利率是12%,则每月您出借资金获得的利息是1%(12% / 12个月). 在有利网,您的投 ...

  8. Cable master 求电缆的最大长度(二分法)

    Description Inhabitants of the Wonderland have decided to hold a regional programming contest. The J ...

  9. GitLab 安装和配置

    一.GitLab 简介 GitLab 是一个利用Ruby on Rails 开发的开源版本控制系统,实现一个自托管的Git项目仓库,可通过Web界面进行访问公开的或者私人项目. 它拥有与GitHub类 ...

  10. Java学习之理解多态

    Java 多态 多态是同一个行为具有多个不同表现形式或形态的能力.多态就是同一个接口,使用不同的实例而执行不同操作,多态性是对象多种表现形式的体现.例如:可以把人分为男人和女人,男人有做力气活的能力, ...