Saltar al contenido

Vista de Android no adjunta al administrador de ventanas

Siéntete libre de divulgar nuestro espacio y códigos con otro, necesitamos tu ayuda para ampliar esta comunidad.

Solución:

Tuve este problema en el que, en un cambio de orientación de la pantalla, la actividad finalizó antes de que AsyncTask con el cuadro de diálogo de progreso se completara. Parecí resolver esto configurando el diálogo en null onPause() y luego verificar esto en AsyncTask antes de descartar.

@Override
public void onPause() 
    super.onPause();

    if ((mDialog != null) && mDialog.isShowing())
        mDialog.dismiss();
    mDialog = null;

... en mi AsyncTask:

protected void onPreExecute() 
    mDialog = ProgressDialog.show(mContext, "", "Saving changes...",
            true);


protected void onPostExecute(Object result) 
   if ((mDialog != null) && mDialog.isShowing())  
        mDialog.dismiss();
   

Después de una pelea con este problema, finalmente termino con esta solución:

/**
 * Dismiss @link ProgressDialog with check for nullability and SDK version
 *
 * @param dialog instance of @link ProgressDialog to dismiss
 */
public void dismissProgressDialog(ProgressDialog dialog) 
    if (dialog != null && dialog.isShowing()) 

            //get the Context object that was used to great the dialog
            Context context = ((ContextWrapper) dialog.getContext()).getBaseContext();

            // if the Context used here was an activity AND it hasn't been finished or destroyed
            // then dismiss it
            if (context instanceof Activity) 

                // Api >=17
                if (!((Activity) context).isFinishing() 
                    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) 
                        if (!((Activity) context).isDestroyed()) 
                            dismissWithExceptionHandling(dialog);
                        
                     else  
                        // Api < 17. Unfortunately cannot check for isDestroyed()
                        dismissWithExceptionHandling(dialog);
                    
                
             else
                // if the Context used wasn't an Activity, then dismiss it too
                dismissWithExceptionHandling(dialog);
        
        dialog = null;
    
}

/**
 * Dismiss @link ProgressDialog with try catch
 *
 * @param dialog instance of @link ProgressDialog to dismiss
 */
public void dismissWithExceptionHandling(ProgressDialog dialog) 
    try 
        dialog.dismiss();
     catch (final IllegalArgumentException e) 
        // Do nothing.
     catch (final Exception e) 
        // Do nothing.
     finally 
        dialog = null;
    

A veces, un buen manejo de excepciones funciona bien si no hay una solución mejor para este problema.

si tienes un Activity objeto dando vueltas, puede utilizar el isDestroyed() método:

Activity activity;

// ...

if (!activity.isDestroyed()) 
    // ...

Esto es bueno si no tienes un anónimo AsyncTask subclase que usas en varios lugares.

Recuerda algo, que tienes la capacidad de decir si te fue preciso.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada.