De bonnes alternatives pour partager un arbre complexe d'objets entre les activités dans Android?

C'est une question que j'ai déjà eu pour quelques applications différentes que j'ai construites, et je n'ai pas encore satisfait de l'une des solutions que j'ai proposées. Je pensais que je l'avais exposé à la communauté pour voir d'autres solutions qu'il pourrait y avoir.

Disons que vous avez une Activité qui télécharge un arbre de données complexe (dans ce cas via json, mais ça pourrait être n'importe quoi), désémarre les données à un ensemble d'objets java (en l'occurrence en utilisant gson, mais encore) , Puis génère des activités supplémentaires pour afficher différentes parties de ces données. Il pourrait y avoir une activité pour voir les Voyages dans votre réponse, et une autre pour afficher les vols dans ces voyages, et peut-être un autre pour voir les passagers de ces vols.

  • Comment puis-je savoir que OnResume vient après onCreate?
  • Connectez-vous avec Google pour que Android ne fonctionne pas dans la version apk
  • Impossible d'ouvrir le port de débogage VM sélectionné (8700)
  • Démarrez le chat vidéo sans interaction avec l'utilisateur - Android
  • Com.android.support:customtabs: aucun programme virtuel launchUrl
  • TextView setTextColor () ne fonctionne pas
  • Ma mise en œuvre initiale de cette application consistait à désactiver tous les Voyages dans la première activité, puis à les passer par valeur (en tant que supplément dans l'intention) à TripActivity. Le TripActivity transmet ensuite des vols individuels à FlightActivity, et ainsi de suite.

    Le problème avec cela est qu'il existe une pause notable entre les activités alors que l'application sérialise et désérialise les données. Nous parlons plusieurs secondes. La pause est très perceptible lorsque mon arbre utilise Serialization ou Parcelable pour transmettre les données. Les tests de performance initiale avec l'utilisation de Google Parcelable montrent plutôt une accélération d'environ 30% sur la sérialisation, mais Parcelable est difficile à utiliser et ne semble pas traiter les références d'objets circulaires comme la Serialisation, et, en outre, il fait toujours une pause pendant presque autant de secondes, J'ai donc mis cette expérience sur le backburner pendant que j'essaye d'autres choses.

    Alors, j'ai essayé de déplacer l'arborescence des objets directement dans la classe Application. Chaque activité obtient simplement l'arbre directement de l'application chaque fois qu'il en a besoin. Cela rend les performances tout à fait satisfaisantes, mais la manipulation de cas d'angle comme le démarrage / arrêt inattendu de l'activité (soit en raison de collisions d'activité, soit parce que l'activité a été fermée temporairement pour rendre plus de mémoire disponible, ou quelle que soit l'autre cause) semble délicate. Peut-être que ce n'est pas plus que la mise en œuvre onSaveInstanceState() , je ne suis pas sûr, mais la solution semble un peu piquante, donc je n'ai pas encore étudié.

    Donc, à la recherche d'une solution moins cobbled, j'ai essayé de créer un ContentProvider personnalisé pour stocker et récupérer mes objets. Puisque ContentProviders peut être configuré pour s'exécuter en cours en utilisant multiprocess=true , j'ai pensé que ce serait un excellent moyen d'éviter les coûts de sérialisation tout en faisant quelque chose de plus "standard" que de stocker des données dans l'objet Application. Cependant, ContentProviders n'était clairement pas destiné à renvoyer des types d'objet arbitraires: ils ne prennent en charge que des types tels que des nombres, des chaînes, des booléens, etc. Il apparaît que je peux finagle un pour stocker des objets arbitraires en utilisant ContentResolver.getContentProviderClient().getLocalContentProvider() et En accédant directement à ma classe personnalisée, mais je ne suis pas sûr que ce soit moins de piratage que de stocker des données dans l'objet Application.

    Certainement, quelqu'un doit avoir une bonne solution à ce problème. Qu'est-ce que je fais mal?

    3 Solutions collect form web for “De bonnes alternatives pour partager un arbre complexe d'objets entre les activités dans Android?”

    En plus de la solution fiXedd, une autre est d'utiliser un service local. Demandez au service de «posséder» les objets, avec des activités appelant les API du service pour obtenir tout ce dont il a besoin. Le service peut également être responsable de l'extraction et de l'analyse des données, encapsulant ce bit de logique.

    L'objet Application est le "step-child à tête rouge" des composants Android. Les membres de l'équipe de base de l'Android sont venus s'opposer à la création de sous-classes d' Application personnalisées, bien qu'elle soit certainement supportée par l'API. Après avoir conçu une application ADC2 200 qui a exploité une sous-classe Application personnalisée, je peux dire que j'aurais dû utiliser un service dans mon cas aussi. Vis et apprend…

    En utilisant le modèle de liaison locale, votre service sera automatiquement créé et détruit au besoin, de sorte que vous ne devez pas vous en préoccuper. Et, par définition, un service local s'exécute dans le même processus / VM que vos activités, de sorte que vous ne devez pas vous soucier de gérer les frais généraux comme vous le feriez dans le scénario ContentProvider .

    La façon dont je manipule ceci dans une de mes applications est de télécharger les données puis de la pousser dans une base de données. De cette façon, je n'ai pas à transporter tous ces objets autour d'eux (ce qui, IIRC, mange environ 1kb chacun juste pour l'instanciation de l'objet) et je peux facilement extraire les données dont j'ai besoin. Je ne sais pas si cela fonctionnera pour vous, mais cela a fonctionné pour mon cas d'utilisation.

    Une autre approche serait de sauvegarder les objets de données dans un fichier de préférences partagées. C'est ainsi que nous avons mis en œuvre une de nos applications, mais je n'ai pas aimé cette approche parce qu'elle semble trop lente.

    C'est une mauvaise pratique de codage, mais le moyen le plus rapide est de simplement utiliser un service pour analyser les données et enregistrer les données dans une classe statique que vous pouvez utiliser pour le reste de la vie de l'application.

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