android - Parcel Unmarshalling código de tipo desconocido
exception parcelable (6)
Ocurrí el mismo error cuando leí el paquete.
Verifique el orden y cuente mientras lee / escribe sus clases Parcelable y sus respectivas subclases.
Estamos obteniendo este error en los informes de Crash registrados por Play Store. No puedo replicar esto en todas nuestras pruebas. ¿Alguien más tiene el mismo problema o solución? La cosa es que ni siquiera sabemos qué hacer para replicar este error.
Todos los objetos Parcelable tienen CREATOR, writeToParcel () y contructor definidos. Todas las listas y tipos complejos se inicializan y se verifican nulos.
java.lang.RuntimeException: Unable to start activity ComponentInfo{au.com.company/au.com.company.DetailsActivity}: java.lang.RuntimeException: Parcel android.os.Parcel@42d6e270: Unmarshalling unknown type code 6881381 at offset 11268
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2247)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2297)
at android.app.ActivityThread.access$700(ActivityThread.java:152)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1282)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:137)
at android.app.ActivityThread.main(ActivityThread.java:5328)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:511)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1102)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:869)
at dalvik.system.NativeStart.main(Native Method)
Caused by: java.lang.RuntimeException: Parcel android.os.Parcel@42d6e270: Unmarshalling unknown type code 6881381 at offset 11268
at android.os.Parcel.readValue(Parcel.java:2032)
at android.os.Parcel.readMapInternal(Parcel.java:2225)
at android.os.Bundle.unparcel(Bundle.java:223)
at android.os.Bundle.getSparseParcelableArray(Bundle.java:1240)
at android.support.v4.app.FragmentManagerImpl.moveToState(SourceFile:861)
at android.support.v4.app.FragmentManagerImpl.moveToState(SourceFile:1104)
at android.support.v4.app.FragmentManagerImpl.moveToState(SourceFile:1086)
at android.support.v4.app.FragmentManagerImpl.dispatchCreate(SourceFile:1872)
at android.support.v4.app.FragmentActivity.onCreate(SourceFile:215)
at android.support.v7.app.ActionBarActivity.onCreate(SourceFile:97)
at au.com.company.DetailsActivity.onCreate(SourceFile:40)
at android.app.Activity.performCreate(Activity.java:5250)
at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1097)
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2211)
... 11 more
Estaba teniendo el problema con una vista personalizada que tiene su propia implementación de View.BaseSavedState. Resultó que el método writeToParcel () tenía llamadas de método en el orden incorrecto.
Era molesto encontrar el problema y tuve que pasar la depuración del SDK de Android hasta la clase Bundle, donde se llama unparcel ():
synchronized void unparcel() {
if (mParcelledData == null) {
return;
}
int N = mParcelledData.readInt();
if (N < 0) {
return;
}
if (mMap == null) {
mMap = new HashMap<String, Object>(N);
}
mParcelledData.readMapInternal(mMap, N, mClassLoader);
mParcelledData.recycle();
mParcelledData = null;
}
La línea 223 de su registro es exactamente la llamada readMapInternal (). Allí, el objeto Parcela iterará a través de sus elementos, leyendo los valores uno por uno. El problema generalmente ocurre si algo fue escrito en el orden incorrecto. El método Parcel.readValue (cargador de ClassLoader) los leerá en el orden en que se escribieron, pero si tiene vistas u objetos personalizados, si se escribieron en un orden diferente al que está leyendo ahora, sucederá algo incorrecto en el SIGUIENTE artículo para leer.
Así que encontré el problema al identificar el último elemento que se leyó con éxito. Generalmente, puede identificar eso (si es una vista u objeto personalizado) marcando el nombre de la clase de su creador. Verifique el método de clase de parcela readParcelableCreator ():
public final <T extends Parcelable> Parcelable.Creator<T> readParcelableCreator(
ClassLoader loader) {
String name = readString();
if (name == null) {
return null;
}
...
}
Puede inspeccionar la cadena de nombre para la clase del creador. Si es uno personalizado, puede identificarlo inmediatamente. Luego, si la siguiente lectura bloquea tu aplicación, puedes estar casi seguro de que el culpable fue la lectura anterior.
Espero eso ayude.
Obtuve este error cuando estaba leyendo el origen de la Parcela, para guardar en un Mapa en lugar de verificar que el valor de retorno sea nulo como:
String tag = in.readString();
Double value = in.readDouble();
while (tag != null && value != null) {
this.observations.put(tag, value);
tag = in.readString();
value = in.readDouble();
};
Uno debe almacenar un int para usar para iterar correctamente en el paquete:
int numObservations = in.readInt();
String key;
Double value;
for (int i = 0; i < numObservations; i++) {
key = in.readString();
value = in.readDouble();
map.put(tag, value);
}
También recibí este error pero encontré el problema. Cambié una variable de larga a int pero olvidé cambiar lo siguiente:
Tenía parcel.writeLong(number)
y luego lo leí nuevamente como number=parcel.readInt()
. Lo correcto es parcel.writeInt(number)
.
Compruebe el orden de su read
y write
en sus clases Parcelable y respectivas subclases.
El orden en el que escribe writeToParcel
debe ser el mismo orden que lee dentro de su MyParcelable(Parcel in)
.
Si tiene su propia clase SavedState, asegúrese de que no está Proguardada y tampoco es un atributo estático de CREATOR.
Use algo como:
# Keeping *SavedState and *SavedState#CREATOR
-keep public final class * extends android.view.AbsSavedState
-keepclassmembers public final class * extends android.view.AbsSavedState { *; }