用ArrayList<Parcelable> 实现Parcelable出现NullPoint

I have two Activities, in the first one, I instanciate an ArrayList of Object myObject. In the second activity, i need to get this Arraylist. I've found a tutorial : http://prasanta-paul.blogspot.com/2010/06/android-parcelable-example.html I have implemented my class liked it's explain.

在使用Parcelable的过程中,我需要实例化一个ArrayList对象,下面是代码:

public class Chapitre implements Parcelable{
private int numero;
private String titre;
private String description;
private int nbVideo;
private ArrayList<Video> listeVideo;

public Chapitre(int numero, String titre, String description,
        ArrayList<Video> listeVideo) {
    this.numero = numero;
    this.titre = titre;
    this.description = description;
    this.listeVideo = listeVideo;
    this.nbVideo = listeVideo.size();
}

//Getters and Setters ...

private Chapitre(Parcel source) {
    numero = source.readInt();
    titre = source.readString();
    description = source.readString();
    nbVideo = source.readInt();
    source.readTypedList(listeVideo, Video.CREATOR);
}

@Override
public int describeContents() {
    return 0;
}

@Override
public void writeToParcel(Parcel dest, int flags) {
    dest.writeInt(numero);
    dest.writeString(titre);
    dest.writeString(description);
    dest.writeInt(nbVideo);
    dest.writeTypedList(listeVideo);
}

public static final Parcelable.Creator CREATOR = new Parcelable.Creator() {
    public Chapitre createFromParcel(Parcel in) {
        return new Chapitre(in);
    }

    public Chapitre[] newArray(int size) {
        return new Chapitre[size];
    }
};
}

public class Video implements Parcelable{
private String titre;
private int numero;
private String url;
private String description;
private String imageUrl;
private Bitmap image;
private String duree;

/**
 * 
 * @param nom
 * @param numero
 * @param url
 * @param description
 */
public Video(String titre, String url, String description) {
    super();
    this.titre = titre;
    this.url = url;
    this.description = description;
}

public Video(int numero, String titre, String url, String description) {
    super();
    this.titre = titre;
    this.url = url;
    this.description = description;
    this.numero = numero;
}

public Video(String titre,int numero, String url, String description, String imageUrl) {
    super();
    this.titre = titre;
    this.url = url;
    this.description = description;
    this.imageUrl = imageUrl;
    this.numero = numero;

    setImage(fetchImage(imageUrl));
}


//Getters and Setters ...

@Override
public int describeContents() {
    // TODO Auto-generated method stub
    return 0;
}

@Override
public void writeToParcel(Parcel dest, int flags) {
    dest.writeString(titre);
    dest.writeInt(numero);
    dest.writeString(url);
    dest.writeString(description);
    dest.writeString(imageUrl);
    dest.writeString(duree);


}

public Video(Parcel source){
    /*
     * Reconstruct from the Parcel
     */
    Log.v("TAG", "ParcelData(Parcel source): time to put back parcel data");
    titre = source.readString();
    numero = source.readInt();
    url = source.readString();
    description = source.readString();
    imageUrl = source.readString();
    duree = source.readString();
}

public static final Parcelable.Creator CREATOR = new Parcelable.Creator() {
    public Video createFromParcel(Parcel in) {
        return new Video(in);
    }

    public Video[] newArray(int size) {
        return new Video[size];
    }
};
}

But I get nullPointException on the line "source.readTypedList(listeVideo, Video.CREATOR);" in the class Chapitre.

07-21 10:07:28.212: ERROR/AndroidRuntime(682): FATAL EXCEPTION: main
07-21 10:07:28.212: ERROR/AndroidRuntime(682): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.genicorp.video.proto/com.genicorp.video.proto.Lecture}:     java.lang.NullPointerException
07-21 10:07:28.212: ERROR/AndroidRuntime(682):     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1736)
07-21 10:07:28.212: ERROR/AndroidRuntime(682):     at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1752)
07-21 10:07:28.212: ERROR/AndroidRuntime(682):     at android.app.ActivityThread.access$1500(ActivityThread.java:123)
07-21 10:07:28.212: ERROR/AndroidRuntime(682):     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:993)
07-21 10:07:28.212: ERROR/AndroidRuntime(682):     at android.os.Handler.dispatchMessage(Handler.java:99)
07-21 10:07:28.212: ERROR/AndroidRuntime(682):     at android.os.Looper.loop(Looper.java:126)
07-21 10:07:28.212: ERROR/AndroidRuntime(682):     at android.app.ActivityThread.main(ActivityThread.java:3997)
07-21 10:07:28.212: ERROR/AndroidRuntime(682):     at java.lang.reflect.Method.invokeNative(Native Method)
07-21 10:07:28.212: ERROR/AndroidRuntime(682):     at java.lang.reflect.Method.invoke(Method.java:491)
07-21 10:07:28.212: ERROR/AndroidRuntime(682):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:841)
07-21 10:07:28.212: ERROR/AndroidRuntime(682):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:599)
07-21 10:07:28.212: ERROR/AndroidRuntime(682):     at dalvik.system.NativeStart.main(Native Method)
07-21 10:07:28.212: ERROR/AndroidRuntime(682): Caused by: java.lang.NullPointerException
07-21 10:07:28.212: ERROR/AndroidRuntime(682):     at android.os.Parcel.readTypedList(Parcel.java:1630)
07-21 10:07:28.212: ERROR/AndroidRuntime(682):     at com.genicorp.video.proto.Chapitre.<init>(Chapitre.java:70)
07-21 10:07:28.212: ERROR/AndroidRuntime(682):     at com.genicorp.video.proto.Chapitre.<init>(Chapitre.java:65)
07-21 10:07:28.212: ERROR/AndroidRuntime(682):     at com.genicorp.video.proto.Chapitre$1.createFromParcel(Chapitre.java:89)
07-21 10:07:28.212: ERROR/AndroidRuntime(682):     at com.genicorp.video.proto.Chapitre$1.createFromParcel(Chapitre.java:1)
07-21 10:07:28.212: ERROR/AndroidRuntime(682):     at android.os.Parcel.readParcelable(Parcel.java:1981)
07-21 10:07:28.212: ERROR/AndroidRuntime(682):     at android.os.Parcel.readValue(Parcel.java:1846)
07-21 10:07:28.212: ERROR/AndroidRuntime(682):     at android.os.Parcel.readListInternal(Parcel.java:2092)
07-21 10:07:28.212: ERROR/AndroidRuntime(682):     at android.os.Parcel.readArrayList(Parcel.java:1536)
07-21 10:07:28.212: ERROR/AndroidRuntime(682):     at android.os.Parcel.readValue(Parcel.java:1867)
07-21 10:07:28.212: ERROR/AndroidRuntime(682):     at android.os.Parcel.readMapInternal(Parcel.java:2083)
07-21 10:07:28.212: ERROR/AndroidRuntime(682):     at android.os.Bundle.unparcel(Bundle.java:215)
07-21 10:07:28.212: ERROR/AndroidRuntime(682):     at android.os.Bundle.getParcelableArrayList(Bundle.java:1151)
07-21 10:07:28.212: ERROR/AndroidRuntime(682):     at android.content.Intent.getParcelableArrayListExtra(Intent.java:3634)
07-21 10:07:28.212: ERROR/AndroidRuntime(682):     at com.genicorp.video.proto.Lecture.onCreate(Lecture.java:37)
07-21 10:07:28.212: ERROR/AndroidRuntime(682):     at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1048)
07-21 10:07:28.212: ERROR/AndroidRuntime(682):     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1700)
07-21 10:07:28.212: ERROR/AndroidRuntime(682):     ... 11 more

Hopefully, you've figured this out by now. But for anyone else who stumbles upon this one. The NullPointerException you were getting was caused by the ArrayList never being initialized.

This would fix it:


解决方法如下:

private Chapitre(){
    listVideo = new ArrayList<Video>();
}

private Chapitre(Parcel source) {
    // Call the above constructor
    this();

    numero = source.readInt();
    titre = source.readString();
    description = source.readString();
    nbVideo = source.readInt();
    source.readTypedList(listeVideo, Video.CREATOR);
}

这个问题是在stackoverflow上面查找到的。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值