Android, How to use readTypedList method correctly in a Parcelable class?

16,773

Solution 1

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

Solution 2

Another solution: use createTypedArrayList instead of readTypedList which requires a non-null List object reference

Solution 3

Also keep in mind that you have to read and write parcelable object attribute in the same order! I also 2 hours because the unmarshalling was not in the same order of the marshalling.

Share:
16,773
Gen
Author by

Gen

Updated on June 24, 2022

Comments

  • Gen
    Gen almost 2 years

    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.

    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
    

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

    Thanks in advance