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

 更新时间:2017年02月06日 16:32:36   作者:阿_良  
本篇文章主要介绍了Android中传递对象的三种方法的实现,可以通过Bundle、Intent或者JSON字符串,有兴趣的可以了解一下。

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旋转、平移、缩放和透明度渐变的补间动画

    Android旋转、平移、缩放和透明度渐变的补间动画

    这篇文章主要实现Android旋转、平移、缩放和透明度渐变的补间动画,本文通过实例代码给大家介绍的非常详细,需要的朋友可以参考下
    2018-04-04
  • Android Studio设置绘制布局时的视图

    Android Studio设置绘制布局时的视图

    这篇文章介绍了Android Studio设置绘制布局时视图的方法,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-11-11
  • Android 进入Activity时如何禁止弹出软键盘输入法

    Android 进入Activity时如何禁止弹出软键盘输入法

    这篇文章主要介绍了Android 进入Activity时如何禁止弹出软键盘输入法,文章围绕主题展开具体内容,需要的小伙伴可以参考一下
    2022-05-05
  • Android获取手机SIM卡运营商信息的方法

    Android获取手机SIM卡运营商信息的方法

    这篇文章主要介绍了Android获取手机SIM卡运营商信息的方法,可获得手机的型号、运营商信息及系统版本等,需要的朋友可以参考下
    2014-09-09
  • Android蓝牙通信编程

    Android蓝牙通信编程

    这篇文章主要为大家详细介绍了Android蓝牙通信编程内容,非常详细的蓝牙通信教程,感兴趣的小伙伴们可以参考一下
    2016-07-07
  • Android实现欢迎页快速启动的方法

    Android实现欢迎页快速启动的方法

    这篇文章主要给大家介绍了Android实现欢迎页快速启动的方法,文中给出了详细的方法介绍,对大家具有一定的参考价值,需要的朋友们可以一起来学习学习。
    2017-02-02
  • 解决android studio android monitor打不开的问题

    解决android studio android monitor打不开的问题

    下面小编就为大家分享一篇解决android studio android monitor打不开的问题,具有很的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-01-01
  • Android实现地图轨迹的方法

    Android实现地图轨迹的方法

    这篇文章主要为大家详细介绍了Android实现地图轨迹的方法,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-04-04
  • 详解Java编程中的反射在Android开发中的应用

    详解Java编程中的反射在Android开发中的应用

    这篇文章主要介绍了详解Java编程中的反射在Android开发中的应用,主要来获取安卓系统的属性值,需要的朋友可以参考下
    2015-07-07
  • Jetpack Compose状态专篇精讲

    Jetpack Compose状态专篇精讲

    在今年的Google/IO大会上,亮相了一个全新的 Android 原生 UI 开发框架-Jetpack Compose, 与苹果的SwiftIUI一样,Jetpack Compose是一个声明式的UI框架,这篇文章主要介绍了Jetpack Compose状态管理
    2022-10-10

最新评论