¿Cómo manejar el cambio de orientación de la pantalla cuando el diálogo de progreso y el hilo de fondo están activos?

Mi programa realiza alguna actividad de red en un hilo de fondo. Antes de comenzar, aparece un cuadro de diálogo de progreso. El cuadro de diálogo se descarta en el controlador. Todo esto funciona bien, excepto cuando la orientación de la pantalla cambia mientras el diálogo está activo (y el hilo de fondo está funcionando). En este punto, la aplicación se bloquea, se bloquea o entra en una etapa extraña en la que la aplicación no funciona en absoluto hasta que se eliminan todos los hilos.

¿Cómo puedo manejar correctamente el cambio de orientación de la pantalla?

El código de muestra a continuación coincide aproximadamente con lo que hace mi programa real:

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();
        }
    };
}

apilar:

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)

Intenté descartar el cuadro de diálogo de progreso en onSaveInstanceState, pero eso solo evita un bloqueo inmediato. El hilo de fondo todavía está activo y la interfaz de usuario está parcialmente dibujada. Necesita matar toda la aplicación antes de que vuelva a funcionar.

preguntado el 10 de julio de 09 a las 18:07

Teniendo en cuenta las respuestas que ha recibido, debería cambiar la respuesta aceptada a favor de la mejor, ¿no es así? -

Ver también una pregunta anterior stackoverflow.com/questions/456211/… -

Todos, tengo una gran explicación y posibles soluciones a este problema. Atravesar http://blog.doityourselfandroid.com/2010/11/14/handling-progress-dialogs-and-screen-orientation-changes/ Déjame saber si esto ayudó. -

Hay una explicación bastante completa sobre cómo retener tareas en segundo plano asincrónicas en todas las orientaciones de pantalla en esta entrada del blog. ¡Échale un vistazo! -

Simplemente configure android: configChanges = "Orientation | screenSize" en Activity en el manifiesto. Detendrá a Android para recrear su actividad -

0 Respuestas

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.