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开机自启动apk的方法

    android开机自启动apk的方法

    今天小编就为大家分享一篇android开机自启动apk的方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-08-08
  • Android自定义view绘制表格的方法

    Android自定义view绘制表格的方法

    这篇文章主要为大家详细介绍了Android自定义view绘制表格的方法,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-05-05
  • Android实现简单MD5加密的方法

    Android实现简单MD5加密的方法

    这篇文章主要介绍了Android实现简单MD5加密的方法,涉及Android编码操作及加密的相关实现技巧,需要的朋友可以参考下
    2016-08-08
  • 最好用的Android省市区三级联动选择效果

    最好用的Android省市区三级联动选择效果

    这篇文章主要为大家详细介绍了最好用的Android省市区三级联动选择效果,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-02-02
  • android监控sim卡有没有服务示例(sim卡管理)

    android监控sim卡有没有服务示例(sim卡管理)

    android监听SIM卡有没有服务,可以使用android.telephony.PhoneStateListener类来实现,下面是一个简单的小例子,大家参考使用吧
    2014-01-01
  • Android ViewFlipper翻转视图使用详解

    Android ViewFlipper翻转视图使用详解

    这篇文章主要为大家详细介绍了Android ViewFlipper翻转视图的使用方法,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-05-05
  • Android 自定义view实现水波纹动画效果

    Android 自定义view实现水波纹动画效果

    这篇文章主要介绍了 Android 自定义view实现水波纹动画效果的实例代码,非常不错,具有参考借鉴价值,需要的朋友参考下吧
    2017-01-01
  • RecyclerView的使用之HelloWorld

    RecyclerView的使用之HelloWorld

    RecyclerView是伴随Android 5.0发布的新控件,是一种列表容器,Google意在用新的RecyclerView来取代老旧的ListView和GridView,它的使用灵活性和性能都要优于ListView,通过本文给大家介绍RecyclerView的使用之HelloWorld,需要的朋友参考下
    2016-03-03
  • Jetpack Compose重写TopAppBar实现标题多行折叠详解

    Jetpack Compose重写TopAppBar实现标题多行折叠详解

    这篇文章主要为大家介绍了Jetpack Compose重写TopAppBar实现标题多行折叠示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-11-11
  • Android注册登录实时自动获取短信验证码

    Android注册登录实时自动获取短信验证码

    注册登录或修改密码功能常常需要输入短信验证码,如何自动获取短信验证码,这篇文章就为大家介绍了Androidcv注册登录自动获取短信验证码的实现代码,感兴趣的小伙伴们可以参考一下
    2016-08-08

最新评论