#java #android #bundle #android-intent #parcelable
#java #Android #пакет #android-намерение #parcelable
Вопрос:
Некоторые объекты parcelables, собранные в Intent / bundle, могут сами вмешиваться и ставить под угрозу чтение Intent / Bundle?
Я извлекаю код, в котором, как мне кажется, есть проблема. Этот код работает:
public void writeToParcel(Parcel arg0, int arg1) {
arg0.writeParcelable(object1, arg1);
arg0.writeTypedList(arraylist1);
}
public void readFromParcel(Parcel in) {
object1 = in.readParcelable(object1.class.getClassLoader());
arraylist1 = new ArrayList<object3>();
in.readTypedList(arraylist1, object3.CREATOR);
}
но если я добавлю другой сложный разделяемый объект (со встроенным разделяемым списком массивов):
public void writeToParcel(Parcel arg0, int arg1) {
arg0.writeParcelable(object1, arg1);
arg0.writeParcelable(object2, arg1);
arg0.writeTypedList(arraylist1);
}
public void readFromParcel(Parcel in) {
object1 = in.readParcelable(object1.class.getClassLoader());
object2 = in.readParcelable(object2.class.getClassLoader());
arraylist1 = new ArrayList<object3>();
in.readTypedList(arraylist1, object3.CREATOR);
}
Я получаю букле с более чем 10000000 элементами для arraylist1 (или другие непонятные проблемы)
хотя, если я удаляю строки с помощью arraylist1, это работает:
public void writeToParcel(Parcel arg0, int arg1) {
arg0.writeParcelable(this.object1, arg1);
arg0.writeParcelable(this.object2, arg1);
}
public void readFromParcel(Parcel in) {
object1 = in.readParcelable(object1.class.getClassLoader());
object2 = in.readParcelable(object2.class.getClassLoader());
}
Я пытался создать объект, который расширяет ArrayList и реализует Parcelable, но у меня возникли некоторые другие проблемы (например, android.os.BadParcelableException: ClassNotFoundException при отмене сопоставления 🙂
Если эти объекты сами вмешиваются, поэтому я должен использовать несколько пакетов, чтобы поместить эти разные объекты в одно и то же намерение?
Ответ №1:
Я думаю, что однажды у меня была такая же проблема. Насколько я помню, я исправил это, записывая / читая Parcelable всегда после всех других типов. Что — то вроде:
public void writeToParcel(Parcel arg0, int arg1) {
arg0.writeTypedList(arraylist1);
arg0.writeParcelable(object1, arg1);
arg0.writeParcelable(object2, arg1);
}
public void readFromParcel(Parcel in) {
arraylist1 = new ArrayList<object3>();
in.readTypedList(arraylist1, object3.CREATOR);
object1 = in.readParcelable(object1.class.getClassLoader());
object2 = in.readParcelable(object2.class.getClassLoader());
}
(Хотя я не пробовал этот код)