欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  移动技术

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

程序员文章站 2023-12-19 14:51:58
android中,activity和fragment之间传递对象,可以通过将对象序列化并存入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.性能分析

经过测试,我们得到下图的效果

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

可以看出,通过转换为字符串的速度是最慢的。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等第三方库,这里我将不进行讲解,有兴趣的朋友,可以自行研究。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。

上一篇:

下一篇: