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) :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
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 :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
    @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 !