gpt4 book ai didi

java - Android中parcelable.readArrayList()中ClassLoader的使用

转载 作者:行者123 更新时间:2023-12-01 19:12:59 26 4
gpt4 key购买 nike

我有一个名为 FilterData 的类,它实现了 Parcelable。我有一个成员变量 private ArrayList<String> listPropertyType;在我的类中实现 Parcelable 接口(interface)时,parcel.readArrayList(null) ,参数显示为ClassLoader object 。有了这个成员变量 FilterData类按预期工作。但我想实现一个场景 ClassLoader object被传递到readArrayList()方法。

所以我从文档中收集到的内容对于 public ArrayList readArrayList (ClassLoader loader) 并不清楚。如果ArrayList包含非原始类,我们必须使用 ClassLoader .

在这个场景中使用类加载器的用例是什么以及如何使用它?我想在下面的事情中使用类加载器。添加了成员​​变量private ArrayList<RandomClass> listRandom; RandomClass randomClass;来实现这一点。

我的FilterData类持有:

public FilterData(Parcel parcel)
{
listPropertyType=parcel.readArrayList(null);
listRandom=parcel.readArrayList(randomClass);
}



@Override
public void writeToParcel(Parcel parcel, int i) {
parcel.writeList(listPropertyType);
parcel.writeList(listRandom);
}

我的 RandomClass 是:

public class RandomClass extends ClassLoader{

//this class is for testing classloader in ArrayList in parcelable .readArrayList()

String name;
int age;

public RandomClass(String name, int age) {
this.name = name;
this.age = age;
}
}

这个实现不起作用。那么如何使用它呢?

最佳答案

首先,如果我们想获得类 Parcelable ,我们可以使用网站 www.parcelabler.com 。它将生成该类的语法。其次,如果我们想使用我们自己的类的ArrayList。制作包含 ArrayList 的 Parcelable 类将不起作用。我们还需要将自定义类设置为 Parcelable

如果需要parcelable的类包含成员变量 ArrayList<String> list; ,则从网站生成的类应该是:

public class MyParcelable implements Parcelable {
ArrayList<String> list;

public MyParcelable(ArrayList<String> list) {
this.list = list;
}

protected MyParcelable(Parcel in) {
if (in.readByte() == 0x01) {
list = new ArrayList<String>();
in.readList(list, String.class.getClassLoader());
} else {
list = null;
}
}

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

@Override
public void writeToParcel(Parcel dest, int flags) {
if (list == null) {
dest.writeByte((byte) (0x00));
} else {
dest.writeByte((byte) (0x01));
dest.writeList(list);
}
}

@SuppressWarnings("unused")
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];
}
};

}

如果该类包含我们创建的类的 ArrayList,如 ArrayList<DummyClass> list; ,则代码应为:

public class MyComplexParcelable implements Parcelable {

ArrayList<DummyClass> list;

public MyComplexParcelable(ArrayList<DummyClass> list) {
this.list = list;
}

@Override
public String toString() {
return "MyComplexParcelable{" +
"list=" + list +
'}';
}

protected MyComplexParcelable(Parcel in) {
if (in.readByte() == 0x01) {
list = new ArrayList<DummyClass>();
in.readList(list, DummyClass.class.getClassLoader());
} else {
list = null;
}
}

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

@Override
public void writeToParcel(Parcel dest, int flags) {
if (list == null) {
dest.writeByte((byte) (0x00));
} else {
dest.writeByte((byte) (0x01));
dest.writeList(list);
}
}

@SuppressWarnings("unused")
public static final Parcelable.Creator<MyComplexParcelable> CREATOR = new Parcelable.Creator<MyComplexParcelable>() {
@Override
public MyComplexParcelable createFromParcel(Parcel in) {
return new MyComplexParcelable(in);
}

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

}

如果我们比较这两种情况,语法上没有区别。这两个类都使用in.readList(list, String.class.getClassLoader());in.readList(list, DummyClass.class.getClassLoader());,它使用相应类的ClassLoader对象。

但在后一种情况下,我们需要使 DummyClass 可分割。像这样:

public class DummyClass implements Parcelable {
int age;
String name;

public DummyClass(int age, String name) {
this.age = age;
this.name = name;
}

@Override
public String toString() {
return "DummyClass{" +
"age=" + age +
", name='" + name + '\'' +
'}';
}

protected DummyClass(Parcel in) {
age = in.readInt();
name = in.readString();
}

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

@Override
public void writeToParcel(Parcel dest, int flags) {
dest.writeInt(age);
dest.writeString(name);
}

@SuppressWarnings("unused")
public static final Parcelable.Creator<DummyClass> CREATOR = new Parcelable.Creator<DummyClass>() {
@Override
public DummyClass createFromParcel(Parcel in) {
return new DummyClass(in);
}

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

关于java - Android中parcelable.readArrayList()中ClassLoader的使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59453520/

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