Mon programme fait de l'activité du réseau dans un thread d'arrière-plan. Avant de commencer, il affiche une boîte de dialogue de progression. La boîte de dialogue fermée sur le gestionnaire. Tout cela fonctionne bien, sauf lorsque l'orientation de l'écran change alors que le dialogue est en place (et le thread d'arrière-plan est en cours). À ce stade, l'application se bloque, ou de blocages, ou pénètre dans une étrange scène où l'application ne fonctionne pas du tout jusqu'à ce que tous les fils ont été tués.
Comment puis-je gérer l'orientation de l'écran changement gracieusement?
L'exemple de code ci-dessous correspond à peu près ce que mon programme n':
public class MyAct extends Activity implements Runnable {
public ProgressDialog mProgress;
// UI has a button that when pressed calls send
public void send() {
mProgress = ProgressDialog.show(this, "Please wait",
"Please wait",
true, true);
Thread thread = new Thread(this);
thread.start();
}
public void run() {
Thread.sleep(10000);
Message msg = new Message();
mHandler.sendMessage(msg);
}
private final Handler mHandler = new Handler() {
@Override
public void handleMessage(Message msg) {
mProgress.dismiss();
}
};
}
Pile:
E/WindowManager( 244): Activity MyAct has leaked window com.android.internal.policy.impl.PhoneWindow$DecorView@433b7150 that was originally added here
E/WindowManager( 244): android.view.WindowLeaked: Activity MyAct has leaked window com.android.internal.policy.impl.PhoneWindow$DecorView@433b7150 that was originally added here
E/WindowManager( 244): at android.view.ViewRoot.<init>(ViewRoot.java:178)
E/WindowManager( 244): at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:147)
E/WindowManager( 244): at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:90)
E/WindowManager( 244): at android.view.Window$LocalWindowManager.addView(Window.java:393)
E/WindowManager( 244): at android.app.Dialog.show(Dialog.java:212)
E/WindowManager( 244): at android.app.ProgressDialog.show(ProgressDialog.java:103)
E/WindowManager( 244): at android.app.ProgressDialog.show(ProgressDialog.java:91)
E/WindowManager( 244): at MyAct.send(MyAct.java:294)
E/WindowManager( 244): at MyAct$4.onClick(MyAct.java:174)
E/WindowManager( 244): at android.view.View.performClick(View.java:2129)
E/WindowManager( 244): at android.view.View.onTouchEvent(View.java:3543)
E/WindowManager( 244): at android.widget.TextView.onTouchEvent(TextView.java:4664)
E/WindowManager( 244): at android.view.View.dispatchTouchEvent(View.java:3198)
J'ai essayé de faire disparaître la boîte de dialogue de progression dans onSaveInstanceState, mais cela ne l'empêche immédiate d'un crash. Le thread d'arrière-plan est toujours en cours, et l'INTERFACE utilisateur est en partie tiré de l'état. Besoin de tuer l'ensemble de l'application avant qu'il ne commence à travailler de nouveau.