ProgressDialog - AsyncTask + Changement d'orientation
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:
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:
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...).