Android: Parcelable.writeToParcel et Parcelable.Creator.createFromParcel ne sont jamais appelés

Je suis totalement nouveau pour poster des questions ici, mais j'ai beaucoup lu ici depuis des années. Normalement, je suis toujours capable de trouver mes réponses en effectuant une recherche approfondie sur le Web, mais cette fois je suis en perte …

Après avoir passé encore un autre jour à essayer de comprendre pourquoi cela ne fonctionne pas, j'ai décidé de demander de l'aide, en espérant que vous pouvez me donner quelques conseils, ou mieux, une solution.

  • Comment changer la couleur du texte de SlidingTabLayout?
  • Android ouvrir le navigateur du service en évitant plusieurs onglets
  • Android: mise en page par défaut pour listitem contenant le titre et le sous-titre
  • TabHost affiche le contenu une fois (onCreate)
  • Comment puis-je créer un ImageView dans un code java dans une mise en page existante?
  • Obtenir la liste de contacts et le statut de Skype dans Android
  • Le problème: dans un jeu Android, je suis venu au point où je dois faire en sorte que l'application se souvienne de son état quand un utilisateur, par exemple, appuie sur le bouton de l'écran d'accueil. Après quelques recherches, je me suis rendue compte que pour que mes classes puissent être initialisées dans leurs états appropriés après avoir rouvert l'application, j'ai dû supporter l'interface Parcelable pour les transmettre avec le Bundle.

    Dans mes fonctions onStop et onStart, je sauvegarde et rétablis l'état du jeu vers et depuis un Bundle, mais lorsque j'appelle les fonctions putParcelable et getParcelable sur le Bundle, les fonctions writeToParcel et createFromParcel de l'objet ne sont jamais appelées.

    Craignant que cela ait été dû à la complexité relative du jeu, j'ai pensé que je devais créer une application très simple pour essayer de le faire fonctionner.

    Sur la base de nombreux exemples partagés que j'ai vu en ligne, c'est devenu ma classe:

    public class ParcelableTest implements Parcelable { int id; public ParcelableTest(int newID) { id = newID; } private ParcelableTest(Parcel in) { readFromParcel(in); } public void writeToParcel(Parcel out, int arg1) { writeToParcel(out); } public void writeToParcel(Parcel out) { Log.v("ParcelableTest","Writing to parcel"); out.writeInt(id); } public void readFromParcel(Parcel in) { id = in.readInt(); } public int describeContents() { return 0; } public static final Parcelable.Creator<ParcelableTest> CREATOR = new Parcelable.Creator<ParcelableTest>() { public ParcelableTest createFromParcel(Parcel in) { Log.v("ParcelableTest","Creating from parcel"); return new ParcelableTest(in); } public ParcelableTest[] newArray(int size) { return new ParcelableTest[size]; } }; } 

    Et à partir de mon activité principale, j'appellerais les fonctions suivantes pour sauvegarder / restaurer les données:

     public Bundle saveToBundle(Bundle savedState) { savedState.putParcelable("Test1",mTest1); savedState.putParcelable("Test2",mTest2); return savedState; } public void restoreFromBundle(Bundle savedState) { mTest1 = savedState.getParcelable("Test1"); mTest2 = savedState.getParcelable("Test2"); } 

    Mais pour une raison quelconque, aucune des fonctions (avec les fonctions putParcelable et getParcelable) entraînera les appels Parcelables appropriés dans ma classe de test.

    La chose la plus étrange, c'est qu'il lisait d'une manière ou d'une autre les valeurs correctes (j'ai essayé avec plus de variables dans la classe), mais mon débogage et mon journal montrent que cette application n'arrive jamais à écrireToParcel et à créerFromParcel.

    Qu'est-ce que j'oublie ici?

    Toute aide / pensées seraient appréciées.

  • Passer le fichier avec l'intention, comment puis-je le récupérer
  • ActionBarActivity: ne peut pas être résolu à un type
  • Une application Android se connecte à un service Web - ne fonctionne pas
  • Alternative pour String.join dans Android?
  • Aujourd'hui est le n ° jour de l'année
  • Quel est le but de `convertView` dans l'adaptateur ListView?
  • 3 Solutions collect form web for “Android: Parcelable.writeToParcel et Parcelable.Creator.createFromParcel ne sont jamais appelés”

    Apparemment, la classe Bundle Android n'adhère pas au protocole partagable qui est plutôt suivi pendant la planification IPC.

    Au lieu de cela, il semble que l'implémentation de Bundle écrit et lit l'objet Parcelable dans sa propre carte interne au moyen de la réflexion. À partir d'un test que nous avons fait, il semble que le Bundle écrit / lit tous les champs définis dans votre classe dérivée partagée, simplement parce que vous avez déclaré ces champs.

    Techniquement, la documentation ne dit pas que writeToParcel ou createFromParcel sont appelés depuis onSaveInstance . En fait, si vous cochez savedState dans votre code, vous constaterez qu'il s'agit exactement de la même instance d'objet dans les cas de sauvegarde et de restauration; Il est logique d'éviter de sérialiser-désérialiser si vous le pouvez.
    OTOH, la documentation ne dit pas non plus que la sérialisation n'est pas effectuée. La conclusion devrait être que vous ne devriez pas dépendre de l'un et l'autre cas, supposons simplement que vous obtenez le bon paquet.

    De plus, vous pouvez consulter http://developer.android.com/guide/topics/resources/runtime-changes.html

    Je confirme ce que disent les superjus. Sur l'événement saveToBundle, le package Android ne stocke que les membres de la classe par réflexion et n'appelle pas les fonctions Parcelables. J'ai perdu un jour sur ce problème! triste….

    C'est vraiment mauvais …. Cela signifie que vous stockez potentiellement une quantité énorme de données pour rien, de cette façon.

    coAndroid est un fan Android de Google, tout sur les téléphones Android, Android Wear, Android Dev et Android Games Apps.