1. ホーム
  2. android

Parcelableオブジェクトの配列の読み込みと書き込み

2023-08-16 13:10:28

質問

以下のようなクラスがあり、オブジェクトの配列を区画から読み書きしています。

class ClassABC extends Parcelable {
    MyClass[] mObjList;

    private void readFromParcel(Parcel in) {
        mObjList = (MyClass[]) in.readParcelableArray(
                com.myApp.MyClass.class.getClassLoader()));
    }

    public void writeToParcel(Parcel out, int arg1) {
        out.writeParcelableArray(mObjList, 0);
    }

    private ClassABC(Parcel in) {
        readFromParcel(in);
    }

    public int describeContents() {
        return 0;
    }

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

        public ClassABC createFromParcel(Parcel in) {
            return new ClassABC(in);
        }

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

上記のコードで、私は ClassCastException を読むと readParcelableArray :

ERROR/AndroidRuntime(5880): 原因:java.lang.ClassCastException。[Landroid.os.Parcelable;

上記コードのどこが問題なのでしょうか?オブジェクトの配列を書きながら、まず配列を ArrayList ?

UPDATEです。

オブジェクトの配列を ArrayList に変換して、parcelに追加してもいいのでしょうか?例えば、書くときに

    ArrayList<MyClass> tmpArrya = new ArrayList<MyClass>(mObjList.length);
    for (int loopIndex=0;loopIndex != mObjList.length;loopIndex++) {
        tmpArrya.add(mObjList[loopIndex]);
    }
    out.writeArray(tmpArrya.toArray());

読むとき。

    final ArrayList<MyClass> tmpList = 
            in.readArrayList(com.myApp.MyClass.class.getClassLoader());
    mObjList= new MyClass[tmpList.size()];
    for (int loopIndex=0;loopIndex != tmpList.size();loopIndex++) {
        mObjList[loopIndex] = tmpList.get(loopIndex);
    }

しかし、今度は NullPointerException . 上記のアプローチは正しいですか?なぜNPEを投げるのですか?

どのように解決するのですか?

配列を書くには Parcel.writeTypedArray() メソッドで書き、それを Parcel.createTypedArray() メソッドで読み取る。

MyClass[] mObjList;

public void writeToParcel(Parcel out) {
    out.writeTypedArray(mObjList, 0);
}

private void readFromParcel(Parcel in) {
    mObjList = in.createTypedArray(MyClass.CREATOR);
}

を使うべきではない理由は readParcelableArray() / writeParcelableArray() メソッドは readParcelableArray() を本当に作成するのです。 Parcelable[] を結果として生成します。つまり、このメソッドの結果を MyClass[] . 代わりに MyClass と同じ長さの配列を作成し、 結果の配列からすべての要素を MyClass 配列にコピーします。

Parcelable[] parcelableArray =
        parcel.readParcelableArray(MyClass.class.getClassLoader());
MyClass[] resultArray = null;
if (parcelableArray != null) {
    resultArray = Arrays.copyOf(parcelableArray, parcelableArray.length, MyClass[].class);
}