web-dev-qa-db-fra.com

Code de type inconnu Colis Unmarshalling

Nous obtenons cette erreur dans les rapports d'incident consignés par le Play Store. Je ne peux pas reproduire cela dans tous nos tests. Quelqu'un d'autre a-t-il le même problème ou la même solution? C'est que nous ne savons même pas quoi faire pour reproduire ce bogue.

Tous les objets Parcelable ont CREATOR, writeToParcel () et constructor définis. Toutes les listes et tous les types complexes sont initialisés et nuls vérifiés.

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
19
Manoj Gopal

Je rencontrais le problème avec une vue personnalisée ayant sa propre implémentation de View.BaseSavedState. Il s'est avéré que la méthode writeToParcel () avait des appels de méthode dans le mauvais ordre. 

Il était ennuyeux de trouver le problème et je devais déboguer le SDK Android jusqu'à la classe Bundle, où unparcel () est appelé:

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 ligne 223 de votre journal correspond exactement à l'appel readMapInternal (). Là, l'objet Parcel parcourt ses éléments en lisant les valeurs une à une. Le problème se produit généralement si quelque chose a été écrit dans le mauvais ordre. La méthode Parcel.readValue (ClassLoader Loader) les lira dans l’ordre dans lequel ils ont été écrits, mais si vous avez des vues ou des objets personnalisés, s’ils ont été écrits dans un ordre différent de celui dans lequel vous les lisez, un problème Article suivant à lire.

J'ai donc trouvé le problème en identifiant le dernier élément lu avec succès. Vous pouvez généralement l'identifier (s'il s'agit d'une vue ou d'un objet personnalisé) en vérifiant le nom de la classe de son créateur. Vérifiez la méthode readParcelableCreator () de la classe Parcel:

public final <T extends Parcelable> Parcelable.Creator<T> readParcelableCreator(
        ClassLoader loader) {
    String name = readString();
    if (name == null) {
        return null;
    }
...
}

Vous pouvez inspecter la chaîne de nom pour la classe du créateur. Si c'est une coutume, vous pouvez l'identifier immédiatement. Ensuite, si la lecture suivante bloque votre application, vous pouvez être presque sûr que le coupable était la lecture précédente.

J'espère que ça aide.

22
Ricardo Lage

J'ai aussi eu cette erreur mais j'ai trouvé le problème. J'avais changé une variable de long à int mais j'ai oublié de changer ce qui suit:

J'avais parcel.writeLong(number) et ensuite relu comme number=parcel.readInt(). Le correct est parcel.writeInt(number).

8
David

Vérifiez l'ordre de vos read et write dans vos classes Parcelable et leurs sous-classes respectives.

L'ordre dans lequel vous writeToParcel devrait être le même que celui que vous avez lu dans votre méthode MyParcelable(Parcel in).

1
HyperionX

J'ai eu cette erreur quand je lisais la source du colis, pour enregistrer sur une carte au lieu de vérifier la valeur de retour est null comme

String tag = in.readString();
Double value = in.readDouble();
while (tag != null && value != null) {
    this.observations.put(tag, value);
    tag = in.readString();
    value = in.readDouble();
};

Il faut stocker un int à utiliser pour itérer correctement sur le colis:

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);
}
0
Bruno Peres

J'ai eu la même erreur lors de la lecture du colis. 

Vérifiez l'ordreet comptezen lecture/écriture de vos classes Parcelable et de leurs sous-classes.

0
Karen Chang

Si vous avez votre propre classe SavedState, assurez-vous que ce n'est pas Proguarded ni l'attribut statique CREATOR.

Utilisez quelque chose comme:

# Keeping *SavedState and *SavedState#CREATOR
-keep public final class * extends Android.view.AbsSavedState
-keepclassmembers public final class * extends Android.view.AbsSavedState { *; }
0
William