话说android Activity之间数据传递

  本人原创作品,谢绝转载!    

        Activity之间传数据时,为了避免麻烦,往往会将一些值封装成对象,然后将整个对象传递过去。传对象的时候有两种情况,一种是实现Parcelable接口,一种是实现Serializable接口。下面说说这些情况。

    一、传递Parcelable对象:

        代码:Programmer.java

[java]  view plain copy
  1. import android.os.Parcel;  
  2. import android.os.Parcelable;  
  3.   
  4. public class Programmer implements Parcelable {  
  5.   
  6.     public String sex;  
  7.     public String name;  
  8.       
  9.     public Programmer() {}  
  10.       
  11.     public int describeContents() {  
  12.         return 0;  
  13.     }  
  14.   
  15.     public void writeToParcel(Parcel out, int flags) {  
  16.         out.writeString(sex);  
  17.         out.writeString(name);  
  18.     }  
  19.   
  20.     public static final Parcelable.Creator<Programmer> CREATOR  
  21.             = new Parcelable.Creator<Programmer>() {  
  22.         public Programmer createFromParcel(Parcel in) {  
  23.             return new Programmer(in);  
  24.         }  
  25.   
  26.         public Programmer[] newArray(int size) {  
  27.             return new Programmer[size];  
  28.         }  
  29.     };  
  30.       
  31.     private Programmer(Parcel in) {  
  32.         sex = in.readString();  
  33.         name = in.readString();  
  34.     }  
  35.       
  36. }  

代码:Worker.java

[java]  view plain copy
  1. import java.util.ArrayList;  
  2.   
  3. import android.graphics.Bitmap;  
  4. import android.os.Parcel;  
  5. import android.os.Parcelable;  
  6.   
  7. public class Worker implements Parcelable {  
  8.   
  9.     public String name;  
  10.     public int age;  
  11.     public Programmer programmer;  
  12.     public ArrayList<Programmer> pros = new ArrayList<Programmer>();  
  13.     public Bitmap icon;  
  14.     public Designer designer;  
  15.       
  16.     public Worker() {}  
  17.       
  18.     public int describeContents() {  
  19.         return 0;  
  20.     }  
  21.   
  22.     public void writeToParcel(Parcel out, int flags) {  
  23.         out.writeString(name);  
  24.         out.writeInt(age);  
  25.         out.writeParcelable(programmer, flags);  
  26.         out.writeList(pros);  
  27.         out.writeParcelable(icon, flags);  
  28.         out.writeSerializable(designer);  
  29.     }  
  30.   
  31.     public static final Parcelable.Creator<Worker> CREATOR  
  32.             = new Parcelable.Creator<Worker>() {  
  33.         public Worker createFromParcel(Parcel in) {  
  34.             return new Worker(in);  
  35.         }  
  36.   
  37.         public Worker[] newArray(int size) {  
  38.             return new Worker[size];  
  39.         }  
  40.     };  
  41.       
  42.     private Worker(Parcel in) {  
  43.         name = in.readString();  
  44.         age = in.readInt();  
  45.         programmer = in.readParcelable(Programmer.class.getClassLoader()); // 这个地方的ClassLoader不能为null  
  46.         pros = in.readArrayList(Programmer.class.getClassLoader()); // 这个地方的ClassLoader不能为null  
  47.         icon = in.readParcelable(null); // 这个地方可以为null  
  48.         designer = (Designer) in.readSerializable();  
  49.     }  
  50. }  
        代码:Designer.java
[java]  view plain copy
  1. import java.io.Serializable;  
  2.   
  3. public class Designer implements Serializable {  
  4.   
  5.     public String name;  
  6.     public int age;  
  7. }  

注意Parcel out和in对应的属性顺序不能错,否则得不到值;如果想传递的值没有write和read,同样也是获取不到值的。

实现Parcelable接口我采用的做法是,从android API文档中找到Parcelable接口,详见http://developer.android.com/reference/android/os/Parcelable.html,将demo copy,然后将MyParcelable类名全部替换,再填写write和read的值。在填写值的时候上面的代码给出了一些示例,有时候会出现以下错误:

      1.Caused By:android.os.BadParcelableException: ClassNotFoundException when unmarshalling,原因是ClassLoader设置不对,或者没有传入ClassLoader

       2.java.lang.RuntimeException: Parcelable encountered IOException writing serializable object,原因是传递的Parcelable对象里面的对象也要Parcelable或者Serializable


二、传递Serializable对象:

        Activity之间传递Serializable对象时,被传递的Serializable对象里面的自定义成员对象(非API中的Serializable对象)也要实现Serializable接口,否则会出现Caused by: java.io.NotSerializableException异常。从上面的代码可以看出,在Parcelable对象中是可以传递Serializable对象的,但Serializable对象里面传递的时候可不可以有Parcelable?回答是否定的,一样会产生java.io.NotSerializableException异常。


三、传递集合:

        android api中只能传递Parcelable对象的集合,而不能传递Serializable对象的集合,也就是只能传递ArrayList<Bitmap>,却不能传递ArrayList<Designer>。刚刚开始学android的时候,对象都是被封装成Serializable,再传递,因为Serializable是JAVASE里面的本地化接口,很熟悉,当时也产生疑问,为什么会有Parcelable接口,这两个有什么区别?到后来,当Serializable不能满足要求的时候就明白了,android利用Pacelable对自己的东西进行封装,就像Worker中的Bitmap,在read的时候可以不需要设置ClassLoader。


如有遗漏不当之处,欢迎批评指正!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值