Есть много сообщений о том, как обрабатывать изменение конфигурации во время AsyncTask, но ни один из них не нашел четкого решения относительно приложений, которые находятся в фоновом режиме (onPause()), когда AsyncTask завершает работу и пытается отклонить DialogFragment (совместимость библиотека).
Вот проблема, если у меня есть работа AsyncTask, которая должна отклонить DialogFragment в onPostExecute(), я получаю исключение IllegalStateException, если приложение находится в фоновом режиме при попытке отклонить 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();
}
}
Действие выглядит следующим образом:
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();
}
....
}
Работает отлично, ЕСЛИ приложение не переключается на фон, а SomeTask все еще работает. В этом случае, когда SomeTask пытается отклонитьSomeDialog(), я получаю исключение IllegalStateException.
05-25 16:36:02.237: E/AndroidRuntime(965): java.lang.IllegalStateException: Can not perform this action after onSaveInstanceState
Все сообщения, которые я видел, похоже, указывают на какое-то смелое направление с продуманными обходными решениями. Не существует ли какой-либо андроид? Если бы это был Dialog вместо DialogFragment, то Activity dispDialog() обработал бы его правильно. Если бы это был реальный DialogFragment, а не один из ACP, тогда функция offsetAllowingStateLoss() обработала бы его. Разве нет что-то подобное для версии ACP DialogFragment?