? Hay numerosas publicaciones sobre cómo manejar un cambio de configuración durante una AsyncTask, pero ninguna que encontré dio una solución clara con respecto a las aplicaciones que están en segundo plano (onPause()) cuando una AsyncTask finaliza e intenta descartar un DialogFragment (biblioteca de compatibilidad).¿Cómo se puede manejar descartar un DialogFragment (compatibility lib) al completar una AsyncTask
Este es el problema, si tengo una ejecución AsyncTask que debería descartar un DialogFragment en onPostExecute(), obtengo una IllegalStateException si la aplicación está en segundo plano cuando intenta descartar el DialogFragment.
private static class SomeTask extends AsyncTask<Void, Void, Boolean> {
public SomeTask(SomeActivity tActivity)
{
mActivity = tActivity;
}
private SomeActivity mActivity;
/** Set the view during/after config change */
public void setView(Activity tActivity) {
mActivity tActivity;
}
@Override
protected Boolean doInBackground(Void... tParams) {
try {
//simulate some time consuming process
TimeUnit.SECONDS.sleep(3);
} catch (InterruptedException ignore) {}
return true;
}
@Override
protected void onPostExecute(Boolean tRouteFound) {
mActivity.dismissSomeDialog();
}
}
La actividad tiene el siguiente aspecto:
import android.support.v4.app.FragmentActivity;
import android.support.v4.app.FragmentManager;
public class SomeActivity extends FragmentActivity {
public void someMethod() {
...
displaySomeDialog();
new SomeTask(this).execute();
...
}
public void displaySomeDialog() {
DialogFragment someDialog = new SomeDialogFragment();
someDialog.show(getFragmentManager(), "dialog");
}
public void dismissSomeDialog() {
SomeDialogFragment someDialog = (SomeDialogFragment) getFragmentManager().findFragmentByTag("dialog");
someDialog.dismiss();
}
....
}
funciona bien a menos que el cambios de aplicación a fondo mientras SomeTask todavía se está ejecutando. En ese caso, cuando SomeTask intenta descartar SomeDialog(), obtengo una IllegalStateException.
05-25 16:36:02.237: E/AndroidRuntime(965): java.lang.IllegalStateException: Can not perform this action after onSaveInstanceState
Todas las publicaciones que he visto parecen apuntar en alguna dirección complicada con soluciones elaboradas. ¿No hay alguna forma de manejar esto en Android? Si fuera un cuadro de diálogo en lugar de un cuadro de diálogo, entonces el archivo de descarte de la actividad() lo manejaría correctamente. Si se tratara de un DialogFragment real en lugar de uno de la ACP, entonces descartaría a AllowingStateLoss() lo manejaría. ¿No hay algo como esto para la versión ACP de DialogFragment?
Eche un vistazo a mi [** publicación de blog **] (http://www.androiddesignpatterns.com/2013/08/fragment-transaction-commit-state-loss.html) sobre este tema ... tal vez ayudará. –