J'ai une activité qui démarre AsyncTask et affiche une boîte de dialogue de progression pour la durée de l'opération. L'activité est déclarée ne pas être recréée par rotation ou par glissement du clavier.
<activity android:name=".MyActivity"
android:label="@string/app_name"
android:configChanges="keyboardHidden|orientation"
>
<intent-filter>
</intent-filter>
</activity>
Une fois la tâche terminée, je dissipe le dialogue, mais sur certains téléphones (framework: 1.5, 1.6), une telle erreur est générée:
java.lang.IllegalArgumentException: View not attached to window manager
at android.view.WindowManagerImpl.findViewLocked(WindowManagerImpl.java:356)
at android.view.WindowManagerImpl.removeView(WindowManagerImpl.java:201)
at android.view.Window$LocalWindowManager.removeView(Window.java:400)
at android.app.Dialog.dismissDialog(Dialog.java:268)
at android.app.Dialog.access$000(Dialog.java:69)
at android.app.Dialog$1.run(Dialog.java:103)
at android.app.Dialog.dismiss(Dialog.java:252)
at xxx.onPostExecute(xxx$1.java:xxx)
Mon code est:
final Dialog dialog = new AlertDialog.Builder(context)
.setTitle("Processing...")
.setCancelable(true)
.create();
final AsyncTask<MyParams, Object, MyResult> task = new AsyncTask<MyParams, Object, MyResult>() {
@Override
protected MyResult doInBackground(MyParams... params) {
// Long operation goes here
}
@Override
protected void onPostExecute(MyResult result) {
dialog.dismiss();
onCompletion(result);
}
};
task.execute(...);
dialog.setOnCancelListener(new OnCancelListener() {
@Override
public void onCancel(DialogInterface arg0) {
task.cancel(false);
}
});
dialog.show();
D'après ce que j'ai lu ( http://bend-ing.blogspot.com/2008/11/properly-handle-progress-dialog-in.html ) et vu dans les sources Android, il semble que la seule situation possible pour l'obtenir l'exception est lorsque l'activité a été détruite. Mais comme je l'ai mentionné, j'interdis les activités récréatives pour les événements de base.
Donc, toutes les suggestions sont très appréciées.