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等第三方库,这里我将不进行讲解,有兴趣的朋友,可以自行研究。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。