全网整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:400-708-3566

Android中传递对象的三种方法的实现

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

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

1.Serializable

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字符串

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容器中的数据

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方法来获取对象。

@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  # 传递对象  # 传递bundle  # intent传递对象  # Android List(集合)中的对象以某一个字段排序案例  # Android使用FontMetrics对象计算位置坐标  # Android使用Canvas对象实现刮刮乐效果  # Android编程实现全局获取Context及使用Intent传递对象的方法详解  # Android中将Bitmap对象以PNG格式保存在内部存储中的方法  # Android中利用C++处理Bitmap对象的实现方法  # Android中实现长按修改ListView对象的内容  # Android中深入学习对象的四种引用类型  # 可以通过  # 可以使用  # 序列化  # 转化为  # 第三方  # 方法来  # 创建一个  # 时用  # 如果你  # 本类  # 这两个  # 将是  # 有兴趣  # 这样一个  # 我将  # 可以看出  # 句话  # 也许会  # 转换为  # 还必须 


相关文章: Thinkphp 中 distinct 的用法解析  如何选择美橙互联多站合一建站方案?  如何高效利用亚马逊云主机搭建企业网站?  如何在IIS服务器上快速部署高效网站?  临沂网站制作公司有哪些,临沂第四中学官网?  常州自助建站工具推荐:低成本搭建与模板选择技巧  如何在阿里云虚拟主机上快速搭建个人网站?  C++中的Pimpl idiom是什么,有什么好处?(隐藏实现)  大学网站设计制作软件有哪些,如何将网站制作成自己app?  如何自己制作一个网站链接,如何制作一个企业网站,建设网站的基本步骤有哪些?  建站VPS推荐:2025年高性能服务器配置指南  建站之星ASP如何实现CMS高效搭建与安全管理?  如何用美橙互联一键搭建多站合一网站?  成都响应式网站开发,dw怎么把手机适应页面变成网页?  公司网站设计制作厂家,怎么创建自己的一个网站?  巅云智能建站系统:可视化拖拽+多端适配+免费模板一键生成  免费视频制作网站,更新又快又好的免费电影网站?  新网站制作渠道有哪些,跪求一个无线渠道比较强的小说网站,我要发表小说?  韩国代理服务器如何选?解析IP设置技巧与跨境访问优化指南  专业网站设计制作公司,如何制作一个企业网站,建设网站的基本步骤有哪些?  如何使用Golang安装API文档生成工具_快速生成接口文档  如何在局域网内绑定自建网站域名?  网站制作外包价格怎么算,招聘网站上写的“外包”是什么意思?  怎么制作网站设计模板图片,有电商商品详情页面的免费模板素材网站推荐吗?  手机网站制作平台,手机靓号代理商怎么制作属于自己的手机靓号网站?  常州自助建站费用包含哪些项目?  c# 在ASP.NET Core中管理和取消后台任务  电视网站制作tvbox接口,云海电视怎样自定义添加电视源?  存储型VPS适合搭建中小型网站吗?  制作网站的软件免费下载,免费制作app哪个平台好?  义乌企业网站制作公司,请问义乌比较好的批发小商品的网站是什么?  如何在阿里云服务器自主搭建网站?  如何设计高效校园网站?  道歉网站制作流程,世纪佳缘致歉小吴事件,相亲网站身份信息伪造该如何稽查?  智能起名网站制作软件有哪些,制作logo的软件?  如何选购建站域名与空间?自助平台全解析  如何确认建站备案号应放置的具体位置?  建站之星如何助力网站排名飙升?揭秘高效技巧  建站之星代理平台如何选择最佳方案?  哈尔滨网站建设策划,哈尔滨电工证查询网站?  上海网站制作网站建设公司,建筑电工证网上查询系统入口?  如何在Windows环境下新建FTP站点并设置权限?  制作网站的过程怎么写,用凡科建站如何制作自己的网站?  小说建站VPS选用指南:性能对比、配置优化与建站方案解析  整蛊网站制作软件,手机不停的收到各种网站的验证码短信,是手机病毒还是人为恶搞?有这种手机病毒吗?  佛山企业网站制作公司有哪些,沟通100网上服务官网?  山东网站制作公司有哪些,山东大源集团官网?  宁波自助建站系统如何快速打造专业企业网站?  网站海报制作教学视频教程,有什么免费的高清可商用图片网站,用于海报设计?  云南网站制作公司有哪些,云南最好的招聘网站是哪个? 

您的项目需求

*请认真填写需求信息,我们会在24小时内与您取得联系。