Объект, реализующий интерфейс Parcelable, содержащий List, генерирует исключение NullPointerException - PullRequest
3 голосов
/ 05 августа 2011

Я пытаюсь создать объект, содержащий List объектов, которые можно разложить на части с помощью интерфейса Parcelable.Я не могу прочитать объект Parcel обратно.

Может ли кто-нибудь указать мне правильное направление?Что мне здесь не хватает?

MyParcelable объект:

public class MyParcelable implements Parcelable {

    private int myInt = 0;
    private List<MyListClass> arrList;

    public List<MyListClass> getArrList() {
        return arrList;
    }

    public void setArrList(List<MyListClass> arrList) {
        this.arrList = arrList;
    }

    public int getMyInt() {
        return myInt;
    }

    public void setMyInt(int myInt) {
        this.myInt = myInt;
    }

    MyParcelable() {
        // initialization
        arrList = new ArrayList<MyListClass>();
    }

    public MyParcelable(Parcel in) {
        myInt = in.readInt();
        in.readTypedList(arrList, MyListClass.CREATOR);
    }

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

    @Override
    public void writeToParcel(Parcel outParcel, int flags) {
        outParcel.writeInt(myInt);
        outParcel.writeTypedList(arrList);
    }

    public static final Parcelable.Creator<MyParcelable> CREATOR =
            new Parcelable.Creator<MyParcelable>() {

        @Override
        public MyParcelable createFromParcel(Parcel in) {
            return new MyParcelable(in);
        }

        @Override
        public MyParcelable[] newArray(int size) {
            return new MyParcelable[size];
        }
    };
}

MyListClass объект:

  public class MyListClass implements Parcelable{

    private int test;

    public MyListClass()
    {}

    public MyListClass(Parcel read){
        test = read.readInt();
    }

    public int getTest() {
        return test;
    }

    public void setTest(int test) {
        this.test = test;
    }

    public static final Parcelable.Creator<MyListClass> CREATOR = 
        new Parcelable.Creator<MyListClass>() {

            @Override
            public MyListClass createFromParcel(Parcel source) {
                return new MyListClass(source);
            }

            @Override
            public MyListClass[] newArray(int size) {
                return new MyListClass[size];
            }
        };

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

    @Override
    public void writeToParcel(Parcel arg0, int arg1) {
        arg0.writeInt(test);
    }
}

Ответы [ 2 ]

16 голосов
/ 11 августа 2011

Проблема в том, что когда создатель вашего объекта MyParcelable вызывает закрытый конструктор, который берет Parcel, из которого вы восстанавливаете объект, ArrayList все еще неинициализирован, таким образом null.

Теперь вызов метода readTypedList() пытается записать содержимое Parcel s в указанное вами ArrayList, которое выдает NullPointerEception, поскольку оно еще не инициализировано.

Решение состоит в том, чтобыинициализируйте ArrayList перед вызовом этого метода.

public MyParcelable(Parcel in) {
    myInt = in.readInt();
    arrList = new ArrayList<MyListClass>();
    in.readTypedList(arrList, MyListClass.CREATOR);
}
1 голос
/ 11 августа 2011

in.readTypedList(arrList, MyListClass.CREATOR);

arrList на данный момент не был инициализирован при вызове return new MyParcelable(in);

...