Mein Programm führt einige Netzwerkaktivitäten in einem Hintergrund-Thread aus. Vor dem Start wird ein Fortschrittsdialog eingeblendet. Der Dialog wird durch den Handler beendet. Das alles funktioniert gut, außer wenn sich die Bildschirmausrichtung ändert, während das Dialogfeld angezeigt wird (und der Hintergrund-Thread läuft). An diesem Punkt stürzt die Anwendung entweder ab, oder sie blockiert, oder sie gerät in ein seltsames Stadium, in dem die Anwendung überhaupt nicht mehr funktioniert, bis alle Threads beendet wurden.
Wie kann ich die Änderung der Bildschirmausrichtung elegant handhaben?
Der Beispielcode unten entspricht in etwa dem, was mein echtes Programm tut:
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();
}
};
}
Stapel:
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)
Ich habe versucht, den Fortschrittsdialog in onSaveInstanceState zu schließen, aber das verhindert nur einen sofortigen Absturz. Der Hintergrund-Thread läuft noch, und die Benutzeroberfläche ist in teilweise gezeichneten Zustand. Müssen Sie die gesamte App zu beenden, bevor es wieder zu arbeiten beginnt.