Unmarshalling des erreurs dans l'application Android personnalisé parcelable classes
Pour mon application Android, je reçois plusieurs unmarshalling erreurs même si je pense que j'ai fait tout ce qui est nécessaire pour enregistrer et charger des objets via Parcelable
s. Pouvez-vous me dire quel est le problème avec mon code?
Erreur 1:
java.lang.RuntimeException: Unable to start activity ComponentInfo
Caused by: java.lang.RuntimeException: Parcel android.os.Parcel@41279860: Unmarshalling unknown type code 6619241 at offset 1372
at android.os.Parcel.readValue(Parcel.java:1922)
at android.os.Parcel.readMapInternal(Parcel.java:2094)
at android.os.Bundle.unparcel(Bundle.java:223)
at android.os.Bundle.getParcelable(Bundle.java:1158)
at android.app.Activity.onCreate(Activity.java:860)
at my.app.package.PlayComputer.onCreate(PlayComputer.java:1012)
at android.app.Activity.performCreate(Activity.java:4465)
Ligne 1012 dans MyActivity
est l'appel à super.onCreate(savedInstanceState);
dans le Activity
's onCreate()
.
protected void onSaveInstanceState(Bundle savedInstanceState) {
if (myObject == null) {
savedInstanceState.putParcelable("myObject", null);
}
else {
savedInstanceState.putParcelable("myObject", myObject);
}
savedInstanceState.putInt(...);
savedInstanceState.putString(...);
savedInstanceState.putBoolean(...);
super.onSaveInstanceState(savedInstanceState);
}
myObject
est de classe MyObject
qui possède les méthodes suivantes:
public void writeToParcel(Parcel out, int flags) {
out.writeIntArray(...);
out.writeInt(...);
out.writeStringArray(...);
out.writeString(...);
out.writeParcelableArray(..., flags);
}
public static final Parcelable.Creator<MyObject> CREATOR = new Parcelable.Creator<MyObject>() {
public MyObject createFromParcel(Parcel in) {
try {
if (in == null) {
return null;
}
else {
return new MyObject(in);
}
}
catch (Exception e) {
return null;
}
}
public MyObject[] newArray(int size) {
return new MyObject[size];
}
};
private MyObject(Parcel in) {
in.readIntArray(...);
... = in.readInt();
in.readStringArray(...);
... = in.readString();
... = (OtherObject[]) in.readParcelableArray(OtherObject.class.getClassLoader());
}
Erreur 2:
java.lang.RuntimeException: Unable to start activity ComponentInfo
Caused by: android.os.BadParcelableException: ClassNotFoundException when unmarshalling:
at android.os.Parcel.readParcelable(Parcel.java:1971)
at android.os.Parcel.readValue(Parcel.java:1859)
at android.os.Parcel.readMapInternal(Parcel.java:2099)
at android.os.Bundle.unparcel(Bundle.java:223)
at android.os.Bundle.getParcelable(Bundle.java:1158)
at android.app.Activity.onCreate(Activity.java:905)
at my.app.package.PlayComputer.onCreate(SourceFile:1012)
Même les fichiers et les classes.
Erreur 3:
java.lang.RuntimeException: Unable to start activity ComponentInfo
Caused by: java.lang.RuntimeException: Parcel android.os.Parcel@4051aff8: Unmarshalling unknown type code 7340149 at offset 1276
at android.os.Parcel.readValue(Parcel.java:1913)
at android.os.Parcel.readMapInternal(Parcel.java:2083)
at android.os.Bundle.unparcel(Bundle.java:208)
at android.os.Bundle.getParcelable(Bundle.java:1100)
at my.app.package.PlayComputer.onCreate(SourceFile:1111)
Cette fois, le fait de causer ligne (1111) est la suivante:
myObject = (MyObject) savedInstanceState.getParcelable("myObject");
Est le GameState(Colis) constructeur d'une faute de frappe et que vous vouliez écrire un MyObject(Colis) constructeur?
Oui, désolé!
Êtes-vous séparément de la création de la matrice des objets dans votre constructeur? Le
Ces tableaux ont été déclarés avant, bien sûr, mais pas nécessairement encore initialisés. À partir de la documentation, je ne peux pas voir que c'est à cette condition: developer.android.com/reference/android/os/Parcel.html
Eh bien, la documentation est très pauvre pour
Oui, désolé!
Êtes-vous séparément de la création de la matrice des objets dans votre constructeur? Le
readXXXArray()
méthodes nécessitent une entièrement initialisé tableau instance d'être passée. Vous pouvez utiliser le createXXXArray()
méthodes pour obtenir une nouvelle instance de ce tableau retourné à vous.Ces tableaux ont été déclarés avant, bien sûr, mais pas nécessairement encore initialisés. À partir de la documentation, je ne peux pas voir que c'est à cette condition: developer.android.com/reference/android/os/Parcel.html
Eh bien, la documentation est très pauvre pour
Parcel
et Parcelable
, donc je ne vois pas les différences de readXXXArray()
et writeXXXArray
.OriginalL'auteur caw | 2012-12-21
Vous devez vous connecter pour publier un commentaire.
Android dispose de deux différents chargeurs de classes: le cadre du chargeur de classe (qui sait comment charger Android classes) et l'APK du chargeur de classe (qui sait comment charger votre code). L'APK du chargeur de classe a le cadre du chargeur de classe en tant que son parent, le sens qu'il peut également charger Android classes.
Erreur #2 est probablement causée par le Faisceau en utilisant le cadre du chargeur de classe de sorte qu'il ne sait pas de vos classes. Je pense que cela peut arriver quand Android doit persister votre Faisceau et de les restaurer plus tard (par exemple lors de l'exécution de mémoire dans l'arrière-plan). Vous pouvez résoudre ce problème en définissant la APK chargeur de classe sur le forfait:
Erreur #1 et #3 sont plus mystérieux, vous êtes peut-être l'écriture de valeurs null dans
writeToParcel()
? Android n'aime pas trop ça, j'ai peur.savedInstanceState.setClassLoader(getClass().getClassLoader());
semble bon, mais je crains que je ne peux appeler cela pour une classe. Si je dois mettre des objets de plus d'une classe dansBundle
? Quelle classe pour appeler qui?En outre, avec quelques modifications, il me semble que si le problème est résolu maintenant: stackoverflow.com/questions/13997550/... Pourriez-vous imaginer cette façon de lire l'objet est ce qui a causé les problèmes?
Cela fonctionne pour tous vos classes comme getClass().getClassLoader() retrive l'APK du chargeur de classe (qui permet de charger tous vos classes). Lors de la lecture à l'aide de readXXXArray(), ce que les tableaux ne vous en passer? Comment savez-vous qu'ils sont de la bonne longueur? createTypedArray() et d'autres pas écrire/lire les informations de type qui signifie que les chargeurs de classe ne sont pas vraiment impliqués.
Je ne savais pas que
readXXXArray()
n'est pas la fonction adéquate, car la documentation est très pauvre sur ce sujet. Donc en gros, on devrait toujours utilisercreateXXXArray()
, à moins qu'un tableau d'une longueur spécifique est nécessaire, non? EtwriteTypedArray()
devrait être préféré àwriteParcelableArray()
ainsi, n'est-ce pas? Comme ma classe implémenteParcelable
, je peux utiliser les deux.La documentation est terrible ici, j'ai regardé la source à la place. Ouais, readXXXArray() n'est utile que si vous avez un tableau de taille fixe. Je pense que writeTypedArray() est un peu plus propre oui, je ne suis pas vraiment sûr de ce que leur intention avec ces différents appels ont été bien que. Vous devriez seulement besoin de définir lors de la restauration, lors de l'enregistrement que vous avez déjà les classes chargées de sorte que leur chargeur de classe est connue.
OriginalL'auteur alexanderblom
Par le regard de celui-ci, le
createFromParcel
etnewArray
devrait être remplacé comme ceci:Edit:
J'ai oublié de mentionner que pour la ci-dessus fonctionne, il doit avoir été un constructeur vide!
MyObject(in)
pour rendre les choses plus claires. Ah ok, peut-être que vous ne voyez pas cela à cause de ma faute de frappe dans le constructeur du nom, qui a été corrigé maintenant.La seule chose à laquelle je pense, il faudrait peut-être un constructeur vide, ont modifié la réponse...
veuillez vérifier que vous êtes
@Override
les deux méthodesdescribeContents()
etwriteToParcel()
🙂J'ai vérifié que je suis en substituant ces méthodes - et oui, je le fais. Ne voyez-vous pas que votre solution et mon pas-vraiment-solution de travail sont exactement les mêmes? Je viens de mettre du code dans une méthode d'aide appelé
GameState(Parcel in)
- tout comme dans la documentation.C'est la façon dont je l'utilise dans mes projets et n'ont pas de problèmes avec
Parcelable
- désolé si ma réponse n'est pas d'une grande aide pour vous.OriginalL'auteur t0mm13b
Avant la lecture de bundle, ensemble de chargeur de classe:
Cette sauvé mon temps!
OriginalL'auteur hovo888s