gpt4 book ai didi

android - 读写 Parcelable 对象数组

转载 作者:IT老高 更新时间:2023-10-28 13:12:00 27 4
gpt4 key购买 nike

我有以下类,它从/向包裹读取和写入对象数组:

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

在上面的代码中,我在读取 readParcelableArray 时得到一个 ClassCastException:

ERROR/AndroidRuntime(5880): Caused by: java.lang.ClassCastException: [Landroid.os.Parcelable;

上面的代码有什么问题?在编写对象数组时,我应该先将数组转换为 ArrayList 吗?

更新:

是否可以将Object数组转换为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);
}

关于android - 读写 Parcelable 对象数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10071502/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com