Utilisation de `onretaincustomnonconfigurationinstance ' pour conserver les données lors des modifications de configuration

Je programmais pour Android depuis un certain temps, et je suis toujours à la recherche de solutions pour conserver les données sur les changements de configuration. Mis à part l'enregistrement de Parcelables dans Bundle de L'activité dans onSaveInstanceState docs suggèrent d'utiliser Fragment avec setRetainInstance drapeau défini sur true.

Mais je viens de rencontrer du code qui utilise onRetainCustomNonConfigurationInstance pour contenir des objets arbitraires (de manière fantaisiste, mais essentiellement de gros objets sans références à Activity etc.). Je n'ai jamais vu cette méthode utilisée, donc j'en ai les doutes:

  • cette méthode est-elle sûre d'appeler pour stocker des objets arbitraires (dans un sens que je peux être sûr qu'elle va être appelée, et qu'elle ne sera pas obsolète/supprimée de sitôt)?
  • En quoi cette méthode est-elle différente de onRetainNonConfigurationInstance(), qui devrait également retourner Object, et devrait essentiellement fonctionner de la même manière?
  • l'utilisation du fragment conservé est-elle encore meilleure, pour une raison quelconque?

En prime, je serais reconnaissant pour tous les autres conseils ou solutions pour sauver l'état de des objets comme AsyncTask, Observable, voir les présentateurs et continuer

22
demandé sur wasyl 2015-06-05 21:23:02

1 réponses

Cette méthode est-elle sûre à appeler pour stocker des objets arbitraires (dans un sens que je peux être sûr qu'il va être appelé, et que ce ne sera pas le cas obsolète / supprimé de sitôt)?

onRetainCustomNonConfigurationInstance() est une méthode relativement nouvelle et il n'est pas obsolète. Je suppose vraiment qu'il ne va pas disparaître bientôt, car il n'y a aucune raison d'introduire quelque chose de nouveau juste pour l'enlever. Vous pouvez l'utiliser en toute sécurité.

En quoi cette méthode est-elle différente de onRetainNonConfigurationInstance(), qui devrait également retourner L'objet, et en substance devrait fonctionner de la même manière?

onRetainNonConfigurationInstance() toujours renvoyer une instance de la classe interne NonConfigurationInstances avec des fragments conservés, des états de chargeurs, etc. Vous ne pouvez pas (et ne devriez pas) modifier ce comportement du système. C'est pourquoi la méthode est final et vous ne pouvez pas le remplacer.

Si vous souhaitez conserver votre instance personnalisée, vous devez remplacer onRetainCustomNonConfigurationInstance() et la renvoyer à partir de là.

En fait, onRetainNonConfigurationInstance() appels onRetainCustomNonConfigurationInstance() et conserve l'instance réaccordée avec les autres États comme les fragments conservés et les chargeurs.

L'utilisation du fragment conservé est-elle encore meilleure, pour une raison quelconque?

C'est plutôt une question de cas d'utilisation et de préférences. La logique pourrait être comme ceci. Si votre activité ne contrôle que des fragments et n'a pas d'autre logique spéciale, il est plus facile d'utiliser des fragments conservés. Si votre activité a quelque chose à conserver, vous pouvez utiliser la méthode onRetainCustomNonConfigurationInstance() en toute sécurité. Pour l'instant, dans les deux cas l'état est toujours retenu par le bon vieux et obsolète onRetainNonConfigurationInstance() méthode.

P. s. En ce qui concerne la question bonus sur le stockage d'un état, je suggère plutôt de regarder onSaveInstanceState() méthode. Il était destiné à stocker des États.

14
répondu sergej shafarenka 2015-11-30 18:16:01