Android的,如何在Parcelable类正确使用readTypedList方法?正确、方法、如何在、Android

2023-09-04 23:32:44 作者:假仙女真汉子

我有两个活动,在第一个,我实例化对象myObject的的ArrayList。在第二个活动,我需要得到此ArrayList。我发现了一个教程:http://prasanta-paul.blogspot.com/2010/06/android-parcelable-example.html  我已经实现了我的课很喜欢它的解释。

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.

公共类Chapitre的实现Parcelable {

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];
    }
};

}

公共类视频实现Parcelable {

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];
    }
};

}

不过,我得到nullPointException就行了source.readTypedList(listeVideo,Video.CREATOR);在类Chapitre的。

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

我已经浪费了1天这一点,因此,如果有人可以帮助我,这将是巨大的,

I've already waste 1 day on this, so if anyone could help me, it would be great,

在此先感谢

推荐答案

希望你想通了这一点到现在。但对于其他人谁绊倒在这一个。你得到的NullPointerException异常是由从来没有被初始化的ArrayList中造成的。

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.

这将解决这个问题:

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);
}