知识的领域是无限的,我们的学习也是无限期的。这篇文章主要讲述Android中传递对象的三种方法相关的知识,希望能为你提供帮助。
android知识、前端、后端以至于产品和设计都有涉猎,想成为全栈工程师的朋友不要错过!
Android中,Activity和Fragment之间传递对象,可以通过将对象序列化并存入Bundle或者Intent中进行传递,也可以将对象转化为JSON字符串,进行传递。
序列化对象可以使用java的Serializable
的接口、Parcelable
接口。转化成JSON字符串,可以使用Gson
等库。
1.SerializableModel
- 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());
- 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());
Parcelable
接口需要实现两个方法- describeContents方法。内容接口描述,默认返回0就可以;
- writeToParcel方法。将传递的数据打包到Parcel容器中。
Parcelable.Creator
接口的实例,用于读取Parcel容器中的数据Model
- 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());
文章图片
可以看出,通过转换为字符串的速度是最慢的。Seralizable次之,Parcelable比Seralizable快10倍。所以从性能上考 虑,我们必定优先选择Parcelable。但是Parcelable有大量重复的模板代码,如何简化这些操作,将是下面主要讲解的内容。
5.简化Parcel操作如果你使用android Studio 可以通过安装android-parcelable-intellij-plugin插件,或者自己配置模板进行操作。
5.1 parceler【Android中传递对象的三种方法】除了上面的操作,还有大量的第三方库来简化Parcelable操作。当然使用这些库也许会降低Parcelable的性能。Parceler就是这样一个库。
Parceler使用非常简单,在定义Model时用
@Parcel
进行注解,在传递数据的时候使用Parcels
的wrap
方法来包装成一个Parcelable
对象。获取数据时用Parcels
的unwrap
方法来获取对象。Model
- @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());
推荐阅读
- Android 性能测试工具- GT
- android 实现返回键执行home键方法
- Android之ContentProvider数据存储
- Android - MD之TextInputLayout的使用
- Gradle for Android 系列(初识 Gradle 文件)
- Android - 框架之Retrofit+RxJava的使用
- Android - 框架之ButterKnife的使用
- Android权限管理原理(含6.0-4.3)
- android 4.4/5.1上使用aar的问题