Propriété de Albiri Sigue
customer 27921 at Fri Mar 11 19:19:45 +0100 2011
270 L’art du développement Android
Il n’y a pas de petites économies !
Le problème avec onSaveInstanceState() est que l’on est limité à un Bundle car cette
méthode de rappel est également appelée lorsque tout le processus est arrêté (comme
quand il n’y a plus assez de mémoire) : les données à sauvegarder doivent donc pouvoir
être sérialisées et ne pas dépendre du processus en cours.
Pour certaines activités, cette restriction ne pose pas de problème mais, pour d’autres, elle
peut être assez ennuyeuse. Dans une application de chat, par exemple, vous devrez couper
la connexion au serveur et la rétablir car il n’y a pas moyen de stocker une socket dans un
Bundle ; ceci ne pose pas seulement un problème de performances mais peut également
affecter la discussion elle-même : votre déconnexion et votre reconnexion apparaîtront
dans les journaux du chat.
Un moyen de contourner ce problème consiste à utiliser onRetainNonConfigurationInstance() au lieu d’onSaveInstanceState() pour les "petites" modifications comme
les rotations. La méthode de rappel onRetainNonConfigurationInstance() de votre
activité peut en effet renvoyer un Object, que vous pourrez récupérer plus tard avec
getLastNonConfigurationInstance(). Cet Object peut représenter à peu près tout ce
que vous voulez – généralement, ce sera un objet "contexte" contenant l’état de l’activité,
comme les threads en cours d’exécution, les sockets ouvertes, etc. La méthode
onCreate() de votre activité peut appeler getLastNonConfigurationInstance() – si
elle renvoie une valeur non null, vous disposez de vos sockets, de vos threads, etc. La
plus grande limitation est que vous ne pouvez pas mettre dans ce contexte sauvegardé tout
ce qui pourrait faire référence à une ressource qui sera supprimée, comme un Drawable
chargé à partir d’une ressource.
Le projet Rotation/RotationTwo utilise cette approche pour gérer les rotations. Les
fichiers de description, et donc l’apparence visuelle, sont identiques à ceux de Rotation/
RotationOne. Les différences apparaissent uniquement dans le code Java :
public class RotationTwoDemo extends Activity {
static final int PICK_REQUEST=1337;
Button viewButton=null;
Uri contact=null;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
Button btn=(Button)findViewById(R.id.pick);
btn.setOnClickListener(new View.OnClickListener() {
public void onClick(View view) {
Intent i=new Intent(Intent.ACTION_PICK,
Uri.parse("content://contacts/people"));
Livre Android.book Page 270 Dimanche, 8. novembre 2009 12:23 12
customer 27921 at Fri Mar 11 19:19:45 +0100 2011
270 L’art du développement Android
Il n’y a pas de petites économies !
Le problème avec onSaveInstanceState() est que l’on est limité à un Bundle car cette
méthode de rappel est également appelée lorsque tout le processus est arrêté (comme
quand il n’y a plus assez de mémoire) : les données à sauvegarder doivent donc pouvoir
être sérialisées et ne pas dépendre du processus en cours.
Pour certaines activités, cette restriction ne pose pas de problème mais, pour d’autres, elle
peut être assez ennuyeuse. Dans une application de chat, par exemple, vous devrez couper
la connexion au serveur et la rétablir car il n’y a pas moyen de stocker une socket dans un
Bundle ; ceci ne pose pas seulement un problème de performances mais peut également
affecter la discussion elle-même : votre déconnexion et votre reconnexion apparaîtront
dans les journaux du chat.
Un moyen de contourner ce problème consiste à utiliser onRetainNonConfigurationInstance() au lieu d’onSaveInstanceState() pour les "petites" modifications comme
les rotations. La méthode de rappel onRetainNonConfigurationInstance() de votre
activité peut en effet renvoyer un Object, que vous pourrez récupérer plus tard avec
getLastNonConfigurationInstance(). Cet Object peut représenter à peu près tout ce
que vous voulez – généralement, ce sera un objet "contexte" contenant l’état de l’activité,
comme les threads en cours d’exécution, les sockets ouvertes, etc. La méthode
onCreate() de votre activité peut appeler getLastNonConfigurationInstance() – si
elle renvoie une valeur non null, vous disposez de vos sockets, de vos threads, etc. La
plus grande limitation est que vous ne pouvez pas mettre dans ce contexte sauvegardé tout
ce qui pourrait faire référence à une ressource qui sera supprimée, comme un Drawable
chargé à partir d’une ressource.
Le projet Rotation/RotationTwo utilise cette approche pour gérer les rotations. Les
fichiers de description, et donc l’apparence visuelle, sont identiques à ceux de Rotation/
RotationOne. Les différences apparaissent uniquement dans le code Java :
public class RotationTwoDemo extends Activity {
static final int PICK_REQUEST=1337;
Button viewButton=null;
Uri contact=null;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
Button btn=(Button)findViewById(R.id.pick);
btn.setOnClickListener(new View.OnClickListener() {
public void onClick(View view) {
Intent i=new Intent(Intent.ACTION_PICK,
Uri.parse("content://contacts/people"));
Livre Android.book Page 270 Dimanche, 8. novembre 2009 12:23 12
