Некоторые объекты, которые можно объединить в Intent / bundle, могут мешать друг другу и ставить под угрозу чтение Intent / Bundle? - PullRequest
6 голосов
/ 11 мая 2011

Некоторые объекты, которые могут быть отправлены в 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);
   }

но если я добавлю другой сложный пакетный объект (с внутренним пакетным ArrayList):

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 при unmarshalling:)

Если эти объекты мешают друг другу, поэтому я должен использовать несколько связок, чтобы поместить эти разные объекты в одно и то же намерение?

1 Ответ

7 голосов
/ 11 мая 2011

Я думаю, что однажды у меня была такая же проблема. Насколько я помню, я исправил это, записывая / читая 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());
}

(хотя этот код не пробовал)

...