Моя программа выполняет некоторую сетевую активность в фоновом потоке. Перед запуском открывается диалоговое окно прогресса. Диалог отклоняется в обработчике. Все это работает отлично, за исключением случаев, когда ориентация экрана изменяется, когда диалог вверх (и фоновый поток идет). На этом этапе приложение либо сбой, либо взаимоблокировки, либо попадает в странную стадию, когда приложение не работает вообще до тех пор, пока все потоки не будут убиты.
Как я могу обработать изменение ориентации экрана изящно?
Пример кода ниже соответствует примерно тому, что делает моя настоящая программа:
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();
}
};
}
Stack
E/WindowManager( 244): Activity MyAct has leaked window [email protected] that was originally added here
E/WindowManager( 244): android.view.WindowLeaked: Activity MyAct has leaked window [email protected] 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)
Я попытался отклонить диалог прогресса в onSaveInstanceState, но это просто предотвращает немедленный сбой. Фоновый поток все еще продолжается, и пользовательский интерфейс находится в частично вытянутом состоянии. Вам нужно убить все приложение, прежде чем он снова начнет работать.