Parcelable的那些坑(传自定义对象、List)
来源:互联网 发布:农行掌上银行网络异常 编辑:程序博客网 时间:2024/06/05 14:47
Parcelable是安卓中的一个接口,用于实现序列化。同Serializable一样。
二者的区别:Parcelable效率要高于Serializable。主要用在内存中实现序列化。在安卓中推荐使用Parcelable。但是实现起来要稍微麻烦些。
Serializable主要用于在存储设备中实现序列化。实现起来比较简单。
1.Parcelable使用方法:
自定义类实现Parcelable接口,并重写以下方法:
public class Book implements Parcelable { public String bookName; public int bookId; public boolean isColorBook; public Book() { } public Book(String bookName, int bookId, boolean isColorBook) { super(); this.bookName = bookName; this.bookId = bookId; this.isColorBook = isColorBook; } //反序列化方法 private Book(Parcel p) { bookId = p.readInt(); bookName = p.readString(); isColorBook = p.readInt() == 1; } @Override public int describeContents() { //固定写法 返回0 return 0; } @Override public void writeToParcel(Parcel dest, int flags) { // 序列化方法 dest.writeString(bookName); dest.writeInt(bookId); dest.writeInt(isColorBook ? 1 : 0);// 未提供writeBoolean方法 1为true 0为false } public static final Creator<Book> CREATOR = new Creator<Book>() { @Override public Book createFromParcel(Parcel source) { // TODO Auto-generated method stub return new Book(source); } @Override public Book[] newArray(int size) { // TODO Auto-generated method stub return new Book[size]; } }; }
这样就完成序列化操作了。Parcelable接口中未提供boolean的序列化方法,所以使用int来代替boolean。1为true,0为false。
如果当前类中包含有其他自定义的类,怎么传呢。首先要确保自定义的类实现了可序列化的接口。接下来就是在可序列话方法中稍微修改下就可以了:
public class AllBook implements Parcelable { private String bookName; // 自定义类Book 实现了Pracelable接口 private Book book; public AllBook() { } public AllBook(Parcel p) { // 序列化自定义对象 需要传入上下文类加载器 book = p.readParcelable(Thread.currentThread().getContextClassLoader()); bookName = p.readString(); } public AllBook(String bookName, int bookId, boolean isColor, Book books) { super(); this.bookName = bookName; this.book = books; } public String getBookName() { return bookName; } public void setBookName(String bookName) { this.bookName = bookName; } public int describeContents() { // TODO Auto-generated method stub return 0; } @Override public void writeToParcel(Parcel out, int flags) { // TODO Auto-generated method stub out.writeString(bookName); // 序列化自定义类对象 第二个参数绝大多数情况下传0即可 out.writeParcelable(book, 0); } public static final Creator<AllBook> CREATOR = new Creator<AllBook>() { @Override public AllBook createFromParcel(Parcel source) { // TODO Auto-generated method stub return new AllBook(source); } @Override public AllBook[] newArray(int size) { // TODO Auto-generated method stub return new AllBook[size]; } };}
如果要传自定义集合,同样也要要保证集合中的类已经实现了序列化接口。
代码如下:
public class MyBook implements Parcelable { private String bookName; private int bookId; private boolean isColor; //自定义集合 Book实现了Parcelable接口 private ArrayList<Book> books; public MyBook() { } public MyBook(Parcel p) { bookName = p.readString(); bookId = p.readInt(); isColor = p.readInt() == 1; // 用这种方法会报错。 // books=p.readArrayList(Thread.currentThread().getContextClassLoader()); // 传递自定义List 只能用以下方法 books= in.createTypedArrayList(Book.CREATOR); } public MyBook(String bookName, int bookId, boolean isColor, ArrayList<Book> books) { super(); this.bookName = bookName; this.bookId = bookId; this.isColor = isColor; this.books = books; } public String getBookName() { return bookName; } public void setBookName(String bookName) { this.bookName = bookName; } public int getBookId() { return bookId; } public void setBookId(int bookId) { this.bookId = bookId; } public boolean isColor() { return isColor; } public void setColor(boolean isColor) { this.isColor = isColor; } public ArrayList<Book> getBooks() { return books; } public void setBooks(ArrayList<Book> books) { this.books = books; } @Override public int describeContents() { return 0; } @Override public void writeToParcel(Parcel out, int flags) { //序列化集合 out.writeTypedList(books); out.writeInt(isColor ? 1 : 0); out.writeInt(bookId); out.writeString(bookName); } public static final Creator<MyBook> CREATOR = new Creator<MyBook>() { @Override public MyBook createFromParcel(Parcel source) { return new MyBook(source); } @Override public MyBook[] newArray(int size) { return new MyBook[size]; } }; @Override public String toString() { return "MyBook [bookName=" + bookName + ", bookId=" + bookId + ", isColor=" + isColor + "]"; }
也就是说序列化自定义List的方法为:
out.writeTypedList(list);
反序列化的方法为:
list = in.createTypedArrayList(Entity.CREATOR);
这里保证对象实现了Parcelable接口,传集合内对象的CREATOR
这样就可以传自定义List集合了。
1 0
- Parcelable的那些坑(传自定义对象、List)
- Intent传递Parcelable List对象
- Intent传递Parcelable List对象
- 在android中创建包含对象数组对象List 的Parcelable
- 关于 List 里自定义对象的排序
- List 根据对象的属性自定义排序
- 那些自定义相机的坑
- 自定义对象List数组
- Arrays转List的那些坑
- Android Parcelable的坑
- Parcelable和Serializable(二)--利用Parcelable在Activity之间传递自定义对象
- 可以被传递的类对象Parcelable
- Android 序列化对象Parcelable 的使用
- 对象实例化---Parcelable接口的使用
- 采用Parcelable实现对象的深度拷贝
- Android对象序列化(二)-----Intent传递对象的两种方法(Serializable,Parcelable)
- 自定义View中遇到的那些坑
- Activitie之间传对象,通过Parcelable
- 博客已经迁移到 https://7449.github.io/
- tomcat性能调优
- boost系列化c++对象
- 程序的构建,包括编译、运行、打包和文档生成等
- Zookeeper学习笔记(2)——工作原理
- Parcelable的那些坑(传自定义对象、List)
- PHP正则表达式修饰符的种类及介绍
- UE4 渲染线程执行任务的流程
- 2016 第5届 ● 全球软件案例研究峰会
- 大三,在软件工程学习上的感悟
- diff 比较两个文件夹
- VS2010调试程序--Dump文件方式
- @Autowired与@Resource的区别
- MVP——让码代码的累,让看代码的爽!【未完】