Ошибка:
Unmarshalling неизвестного кода типа XXXXX со смещением XXXXX
Происходит, если у вас есть объект, который реализует Parcelable
, который является деформированным.
public static final Parcelable.Creator<MyClass> CREATOR = new Parcelable.Creator<MyClass>(){
@Override
public MyClass createFromParcel(Parcel source){
// The most common issues are in this constructor.
return new MyClass(source);
}
@Override
public MyClass[] newArray(int size){
return new MyClass[size];
}
}
Когда вам необходимо воссоздать Parcelable
объект, будет вызван return new MyClass(source);
(с использованием приведенного выше примера).И вот здесь возникают наиболее распространенные проблемы:
- У вас есть переменная определенного типа, и вы отменяете ее как другой тип.
Пример: у вас есть переменная id
, относящаяся к типу long, и вы читаете ее вот так id = source.readInt();
Вы пытаетесь прочитать значение, которое недоступно в вашем
Parcelable
.
Пример: Вы пытаетесь id = source.readInt();
, но вы забыли dest.writeInt(id);
Ваш
Parcelable
происходит от другого объекта, который также
Parcelable
, и вы забыли вызвать super в методах чтения и записи.
Пример:
@Override
public void writeToParcel(Parcel dest, int flags) {
// This is missing
super.writeToParcel(dest, flags);
}
Отсутствует правило proguard:
Это сохранит специальные поля всех реализаций Parcelable:
-keepclassmembers class * implements android.os.Parcelable {
static ** CREATOR;
}
tl; dr Этодовольно сложно найти в чем проблема без всего исходного кода.Поэтому я предлагаю вам проверить все свои Parcelable
объекты, которые вы используете в упомянутых вами действиях, и проверить, правильно ли они сформированы.