Bonjour,

J'ai un gros soucis avec la gestion de l'orientation et l'affichage d'une ProgressDialog pendant un long traitement.
En effet si je pivote l'orientation pendant que la progress dialog est active, ça me faut planter mon programme...

Voici mon implementation:
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
 
// android:configChanges="keyboardHidden|orientation" dans le manifest
public class ProgTv extends Activity {
 
	private LoadProgTvData progData;
	/** Called when the activity is first created. */
	@Override
	public void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.main);
 
		//loadProgTvData();
	}
 
	@Override
	public void onConfigurationChanged(Configuration newConfig) {
		super.onConfigurationChanged(newConfig);
		setContentView(R.layout.main);
	}
 
	@Override
	public Object onRetainNonConfigurationInstance() {
		progData.setActivity(null);
		return progData;
	}
 
	@Override
	protected void onResume() {
		super.onResume();
		loadProgTvData();
	}
 
	private void loadProgTvData() {
		final Object retained = getLastNonConfigurationInstance();
		if(retained instanceof LoadProgTvData) {
			progData = (LoadProgTvData) retained;
			progData.setActivity(this);
		} else {
			progData = new LoadProgTvData(this, null);
		}
	}
}
LoadProgTvData :
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
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
public class LoadProgTvData {
	private Activity activity;
	private static List<ProgTvObj> lst_prog = new ArrayList<ProgTvObj>();
	private static ProgTvAdapter progTvAdapter = null;
        private Hours progHours;
	public static enum Hours { BEGINING_EVENING, END_EVENING };
 
	public LoadProgTvData(Activity activity, Hours h) {
		this.activity = activity;
                this.progHours = h;
 
		if(lst_prog.isEmpty())
			new ListRefresher().execute();
		else
			refreshListView();
	}
 
	public void setActivity(Activity activity) {
		this.activity = activity;
		if(!lst_prog.isEmpty())
			refreshListView();
	}
 
	/**
         * Set List of ProgTvObj from an XML stream
         */
	private void setListFromXml() {
		// SAX Parser
		try {
			ProgSaxXml px = new ProgSaxXml(activity.getAssets().open("soir.xml")); // SAX Parser		
			lst_prog = px.getProgList();
		} catch (MalformedURLException e) {
			Log.d("MalformedURLException", "XML Url is malformed", e);
			throw new RuntimeException(e);
		} catch (IOException e) {
			Log.d("IOException", e.toString());
		}
	}
 
	/**
         * Set Adapter of ListView to fill it with ProgTvObj 
         */
	public void refreshListView() {
		//Hours progHours = (Hours) getIntent().getSerializableExtra("tabHours"); // Get Hours value or null if not defined
		if(null != activity) {
			if(null == progTvAdapter)			
				progTvAdapter = new ProgTvAdapter(activity);
			if(null != progHours)
				progTvAdapter.setListProg(myUtils.filter(lst_prog, progHours));
			else
				progTvAdapter.setListProg(lst_prog);
			ListView lstview_prog = (ListView)activity.findViewById(R.id.lstview_prog);
			lstview_prog.setAdapter(progTvAdapter);
			lstview_prog.setOnItemClickListener(progTvAdapter);
		}
	}
 
	class ListRefresher extends AsyncTask<Uri, Void, Void> {
		private ProgressDialog progressDialog;
		@Override
		protected void onPreExecute() {
			if(!lst_prog.isEmpty()) {
				this.cancel(true);
				refreshListView();
			} 
			else
				progressDialog = ProgressDialog.show(activity, null, "Chargement en cours...");
		}
 
		@Override
		protected Void doInBackground(Uri... params) {
			setListFromXml();
			return null;
		}
 
		@Override
		protected void onPostExecute(Void result) {
			progressDialog.dismiss();
			refreshListView();
		}
	}
}
Sachant que si je met loadProgTvData(); dans le OnResume c'est parce que mon Activity est un onglet de mon tableau et le faut de changer d'onglet ne rapelle pas OnCreate. Or j'ai besoin que ma liste soit rafraichit à chaque passage.

Je pense que le problème viens du fait que la ProgressDialog est crée dans un context et le changement d'orientation change le context et donc au moment du dismiss il doit pas savoir quoi faire.

Si vous pouviez m'aider ça serai vraiment sympa. Car le problème sur le lequel je bloque est quand même une chose que tout le monde doit réaliser dans une appli mobile (telechargement avec message d'attente...).