标签:
Parcelable是一个接口,实现该接口的对象可以高效的在程序中被传递。实际上传递的对象是Parcel。根据文档的描述,Parcel是被设计成为了高性能的IPC通信,而不是为了持久化的存储。
实现起来以前觉得还蛮复杂的,今天一看觉得好像又很简单。
首先我们随便写一个Book类,表示数据项。
public class Book { private String name; private int isbn; public String getName() { return name; } public void setName(String name) { this.name = name; } public int getIsbn() { return isbn; } public void setIsbn(int isbn) { this.isbn = isbn; } }
然后让其实现接口Parcelable。
实现这个接口,必须要实现两个方法:describeContents,writeToParcel
describeContents方法可以不怎么管,就返回一个0就完事了。
writeToParcel方法,看方法名就是将数据写入到Parcel对象当中去。
下面看实现Parcelable接口后的Book类。
public class Book implements Parcelable{ private String name; private int isbn; public String getName() { return name; } public void setName(String name) { this.name = name; } public int getIsbn() { return isbn; } public void setIsbn(int isbn) { this.isbn = isbn; } @Override public int describeContents() { return 0; } @Override public void writeToParcel(Parcel arg0, int arg1) { arg0.writeString(name); arg0.writeInt(isbn); } }
writeToParcel方法中的第一个参数就是Parcel对象,该对象中的write*()方法,基本上都是基本的数据类型。
完成上述步骤,就可以使用将Book对象以Parcelable形式进行传递了。比如Intent中的putExtra()可以使用Parcelable对象。
使用方法如下:
Book b = new Book(); b.setIsbn(1000); b.setName("abcd"); Intent i = new Intent(); i.putExtra("book", b); Book b2 = (Book)i.getParcelableExtra("book"); Log.i("test", b2.getName() + ", " + b2.getIsbn());
另外Parcelable接口中还定义了一个名为Creator的接口,注释上写的是,必须要创建一个public的成员变量(field)名为CREATOR才行。
其中有一个createFromParcel()方法,和writeToParcel()为可逆的方法。
加上这个内部类的Book类如下:
public class Book implements Parcelable{ private String name; private int isbn; public String getName() { return name; } public void setName(String name) { this.name = name; } public int getIsbn() { return isbn; } public void setIsbn(int isbn) { this.isbn = isbn; } @Override public int describeContents() { return 0; } @Override public void writeToParcel(Parcel arg0, int arg1) { arg0.writeString(name); arg0.writeInt(isbn); } public static final Parcelable.Creator<Book> CREATOR = new Parcelable.Creator<Book>() { @Override public Book createFromParcel(Parcel arg0) { Book b = new Book(); b.name = arg0.readString(); b.isbn = arg0.readInt(); return b; } @Override public Book[] newArray(int arg0) { return new Book[arg0]; } }; }
这里有一点需要注意!createFromParcel()方法和writeToParcel()方法中使用Parcel对象进行read*()和write*()操作的顺序必须要相同。
以上就是Parcelable的使用方法。
标签:
原文地址:http://www.cnblogs.com/kross/p/4313786.html