基本上我Handler在我的消息中Fragment收到一堆消息,这些消息可能导致对话框被解除或显示.
当应用程序进入后台时,我得到了一个,onPause但仍然可以像我们期望的那样得到我的消息.但是,因为我正在使用片段,所以我不能只关闭并显示对话框,因为这将导致一个IllegalStateException.
我不能只是解雇或取消允许国家损失.
鉴于我有一个Handler我想知道是否有一个推荐的方法,我应该如何在暂停状态下处理消息.
我正在考虑的一个可能的解决方案是记录暂停时播放的消息并将其播放回来onResume.这有点令人不满意,我认为框架中必须有一些东西可以更优雅地处理这个问题.
我开始使用DialogFragment,因为他们通过方向更改和其他东西很好地工作.但是我遇到了令人讨厌的问题.
我有AsyncTask显示进度DialogFragment并解散它onPostExecute.一切正常,除非在onPostExecute应用程序处于后台时发生(例如,在按下Home按钮后).然后我在DialogFragment解雇时得到了这个错误 - " Can not perform this action after onSaveInstanceState".卫生署.常规对话框工作得很好.但不是FragmentDialog.
所以我想知道,在应用程序处于后台时,解雇DialogFragment的正确方法是什么?我没有真正使用Fragments,所以我认为我只是遗漏了一些东西.
android android-fragments android-dialog android-dialogfragment
我正在做一些后台工作并在我这样做时显示DialogFragment.完成我的工作并调用相关的回调后,我将关闭该对话框.当我这样做时,我在Android源代码中遇到了由NPE引起的崩溃,这里:
void dismissInternal(boolean allowStateLoss) {
if (mDialog != null) {
mDialog.dismiss();
mDialog = null;
}
mRemoved = true;
if (mBackStackId >= 0) {
getFragmentManager().popBackStack(mBackStackId,
FragmentManager.POP_BACK_STACK_INCLUSIVE);
mBackStackId = -1;
} else {
FragmentTransaction ft = getFragmentManager().beginTransaction();
ft.remove(this);
if (allowStateLoss) {
ft.commitAllowingStateLoss();
} else {
ft.commit();
}
}
}
Run Code Online (Sandbox Code Playgroud)
特别是在线: FragmentTransaction ft = getFragmentManager().beginTransaction();
Fragments API发布后,我开始使用兼容包将所有已弃用的对话框移植到DialogFraments中.一切都运行良好,直到我注意到我的对话框仅导致ICS崩溃:
E/AndroidRuntime( 883): FATAL EXCEPTION: main
E/AndroidRuntime( 883): java.lang.IllegalStateException: Can not perform this action after onSaveInstanceState
E/AndroidRuntime( 883): at android.support.v4.app.FragmentManagerImpl.checkStateLoss(FragmentManager.java:1254)
E/AndroidRuntime( 883): at android.support.v4.app.FragmentManagerImpl.enqueueAction(FragmentManager.java:1265)
E/AndroidRuntime( 883): at android.support.v4.app.BackStackRecord.commitInternal(BackStackRecord.java:541)
E/AndroidRuntime( 883): at android.support.v4.app.BackStackRecord.commit(BackStackRecord.java:525)
E/AndroidRuntime( 883): at android.support.v4.app.DialogFragment.show(DialogFragment.java:123)
E/AndroidRuntime( 883): at com.myapp.ui.dialogs.TwoButtonDialogFragment.showDialog(TwoButtonDialogFragment.java:84)
Run Code Online (Sandbox Code Playgroud)
我的对话框显示在AsyncTask.onPostExecute()上,以显示对用户的http响应.在深入研究问题之后,我得出的结论是,只有当Activity暂停或停止时才会发生此异常,并且在其他版本的Android上不会发生此异常.我已经尝试使用commitAllowingStateLoss(),但它没有帮助,因为在DialogFragment.show()上抛出了异常.这是我的DialogFragment代码:
private static void showDialog(FragmentActivity activity, String title, String msg,
String positiveButtonText, String negativeButtonText, int id, Bundle args) {
if (activity.isFinishing()) {
return;
}
FragmentManager fmgr = activity.getSupportFragmentManager();
FragmentTransaction ft = fmgr.beginTransaction();
Fragment prev = fmgr.findFragmentByTag(TAG);
if (prev != …Run Code Online (Sandbox Code Playgroud) android android-fragments android-4.0-ice-cream-sandwich android-dialogfragment