j0o0 Posté(e) 15 janvier 2011 Share Posté(e) 15 janvier 2011 Bonjour à tous, Je débute sous Android, et voici la situation : mon activité principale est une TabActivity dans laquelle chaque onglet démarre une nouvelle ListActivity. J'ai besoin au lancement d'une ListActivity d'envoyer une requête HTTP. Voulant faire propre, j'ai utilisé une AsyncTask pour afficher une barre de progression dans l'UI-thread et effectuer la requête dans un autre thread (toutes les ListActivity ont la même structure de code) : public class FilesActivity extends ListActivity { private ArrayList<String> mFiles; private FileAdapter mAdapter; private ProgressDialog mDialog; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.files_list); mFiles = new ArrayList<String>(); mDialog = new ProgressDialog(this); mDialog.setMessage(getResources().getString(R.string.loading)); mDialog.setCancelable(false); new LoadingTask().execute(); mAdapter = new FileAdapter(this, mFiles); setListAdapter(mAdapter); } private class LoadingTask extends AsyncTask<Void, Void, String> { @Override protected void onPreExecute() { mDialog.show(); } @Override protected String doInBackground(Void... params) { String errMsg = null; // [...] Requête HTTP censée remplir mFiles mFiles.add("test"); return errMsg; } @Override protected void onPostExecute(String errMsg) { if (mDialog.isShowing()) { mDialog.dismiss(); } if (errMsg == null) { mAdapter.notifyDataSetInvalidated(); } else { new AlertDialog.Builder(FilesActivity.this) .setMessage(errMsg) .setPositiveButton(R.string.ok, null) .show(); } } } } Le problème, c'est que lors d'un changement d'orientation de l'écran, l'appli plante. On m'a dit d'ajouter le code suivant dans onPause : @Override protected void onPause() { if (mDialog.isShowing()) { mDialog.dismiss(); } super.onPause(); } Avec ceci, lorsque je teste la ListActivity en tant qu'activité principale, je n'ai plus de problème. D'une part, est-ce que quelqu'un pourrait m'expliquer d'où venait le problème ?! Sachant que lors du changement d'orientation de l'écran la barre de progression n'est plus affichée, donc le code ajouté ne devrait pas servir ! D'autre part, lorsque j'utilise les ListActivity comme activités lancées par la TabActivity (onglets), le problème survient à nouveau après quelques rotations d'écran...Il semblerait que le problème soit dû à l'utilisation d'un autre thread que l'UI-thread (AsyncTask), mais avant d'effectuer la rotation d'écran, j'attends que la barre de chargement disparaisse, donc logiquement le thread ne devrait plus exister, si ? Quelqu'un a-t-il une solution à ce problème ? Merci ! Lien vers le commentaire Partager sur d’autres sites More sharing options...
Profete162 Posté(e) 15 janvier 2011 Share Posté(e) 15 janvier 2011 Je me demande si mettre android:configChanges="keyboardHidden|orientation" Dans le manifest ne pourrait pas résoudre tes soucis. Lien vers le commentaire Partager sur d’autres sites More sharing options...
j0o0 Posté(e) 15 janvier 2011 Auteur Share Posté(e) 15 janvier 2011 Oui cela résout le problème, mais je me demande si c'est vraiment la meilleure solution...En tout cas ça fonctionne maintenant, merci ! Lien vers le commentaire Partager sur d’autres sites More sharing options...
chpil Posté(e) 17 janvier 2011 Share Posté(e) 17 janvier 2011 Le problème vient du fait que lors d'un changement d'orientation, Android supprime l'Activity et la recrée dans la foulée, ceci afin de permettre de gérer un layout différent entre portrait et paysage. L'effet de bord, c'est que si comme dans ton cas, on a un AsyncTask en parallèle, et que celui-ci garde une référence sur la première Activity (ou élément lié à cette Activity, telle une boîte de dialogue), après rotation, la référence n'est plus valide (l'Activity ayant été supprimée et une nouvelle créée), et cela peut amener un plantage. Pour remédier à cela, deux solutions: - comme suggéré par profete, mettre l'indication dans le manifest qui indique à Android de ne pas gérer lui-même la rotation; on perd la gestion automatique du layout/des resources adaptés à l'orientation - ou, ce qui est la solution préconisée, laisser faire Android pour le changement d'orientation, et utiliser les méthodes onRetainNonConfigurationInstance/getLastNonConfigurationInstance pour récupérer l'état courant de l'Activity et gérer la recréation de l'Activity Sujet déjà abordé dans un autre post Lien vers le commentaire Partager sur d’autres sites More sharing options...
j0o0 Posté(e) 17 janvier 2011 Auteur Share Posté(e) 17 janvier 2011 Ok merci beaucoup ! Lien vers le commentaire Partager sur d’autres sites More sharing options...
Recommended Posts
Archivé
Ce sujet est désormais archivé et ne peut plus recevoir de nouvelles réponses.