6 votes

Comment mettre en cache les vues avec Android et éviter d'appeler onCreate à chaque fois

J'ai une question qui me tracasse.

Avec Android, j'ai une application qui semble appeler onCreate à chaque fois qu'une nouvelle instance d'une activité est créée, car cette activité est la fille d'une autre et elle se termine elle-même en finissant son rôle pour une partie des données.

L'appel de onCreate à chaque fois semble re-parsing le XML pour créer les vues et réattacher/recréer les écouteurs au code, etc. Y a-t-il un moyen de mettre en cache une activité pour être rappelée à chaque fois, sans la voir si nous cliquons sur le bouton retour dans l'appareil mobile? C'est comme l'avoir vraiment cachée (pas accessible avec le bouton de retour) et détruite uniquement si c'est nécessaire.

Merci à tous d'avance :)

6voto

sooniln Points 9909

Android gérera la plupart des mises en cache de View et d'activité applicables et vous n'aurez pas à vous en soucier. Je -fortement- vous déconseille l'approche d'alexkipar. C'est assez naïf et ne fera qu'aggraver les performances ainsi que créer des fuites de mémoire et un comportement incorrect.

Si vous avez l'impression que les activités sont créées trop souvent, je vous recommanderais de vous assurer que vous utilisez et comprenez correctement le cycle de vie de l'activité. Comme avec tout système, Android équilibre entre efficacité et réutilisabilité, et il y a toujours des compromis à faire.

Une idée fausse courante que vous avez mentionnée concerne l'analyse XML. Le XML pour les vues n'est pas stocké sous forme XML pur, mais plutôt sous une forme compilée pour plus d'efficacité. Vous n'avez pas à vous en soucier, faites confiance au système qui essaie de rendre les choses aussi efficaces que possible pour vous.

1voto

JRL Points 36674

Si elle est appelée, cela signifie que votre processus a terminé son exécution ou a été arrêté par le système.

onCreate sera appelé à chaque démarrage de votre activité. C'est ainsi que fonctionne le cycle de vie de l'activité et il n'y a pas grand-chose que vous puissiez faire à ce sujet.

Si vous souhaitez que votre processus reste en mémoire, vous devriez envisager de le mettre en place en tant que Service.

0voto

e-satis Points 146299

Vous ne pouvez pas empêcher onCreate d'être appelé à chaque création d'activité car c'est ainsi que les choses fonctionnent.

Votre problème ici est plus un problème d'architecture : vous avez une fonctionnalité que vous utilisez très souvent mais vous lui consacrez une activité lourde entière.

Si vous cherchez de la vitesse et de la réactivité, une réponse peut être le ViewFlipper. Vous définissez une activité unique, et lorsque vous utilisez votre fonctionnalité, vous changez simplement la vue. Votre application entière est chargée dès le tout début, puis reste en mémoire jusqu'à ce que Dalvik en ait besoin. Vous pouvez trouver un exemple assez complexe dans le code de l'application open source astrid.

-2voto

Antonio Points 131

Peut-être quelque chose comme ceci vous aidera

Définir une variable

private static View mView = null;

Ensuite, dans onCreate

if (mView == null) {
    mView = LayoutInflater.from(this).inflate(R.layout.VOTRE_MISE_EN_PAGE, null);
}
setContentVIew(mView);

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X