Android 在活动处于后台时关闭DialogFragment(支持库)gets IllegalStateException

Android 在活动处于后台时关闭DialogFragment(支持库)gets IllegalStateException,android,android-fragments,dismiss,illegalstateexception,android-dialogfragment,Android,Android Fragments,Dismiss,Illegalstateexception,Android Dialogfragment,在我的应用程序的活动中,我需要在上传内容时显示一个“加载”不可取消的片段对话框。我在当前活动中通过回调显示此对话框,如下所示: final FragmentManager fm = getSupportFragmentManager(); final FragmentTransaction ft = fm.beginTransaction(); final Fragment prev = fm.findFragmentByTag( "loading" ); if ( prev != null )

在我的应用程序的活动中,我需要在上传内容时显示一个“加载”不可取消的片段对话框。我在当前活动中通过回调显示此对话框,如下所示:

final FragmentManager fm = getSupportFragmentManager();
final FragmentTransaction ft = fm.beginTransaction();
final Fragment prev = fm.findFragmentByTag( "loading" );
if ( prev != null ) {
    ft.remove(prev);
}
ft.addToBackStack(null);
final DialogFragment df = 
        IndeterminateProgressDialogFragment.newInstance(
        getString( R.string.loading_dialog_sending_data ) );
df.setCancelable( false );
df.show( ft, "loading" );
上载发生在从我的ui片段执行的保留片段(使用asynctask)中。上传完成后,onActivityResult会通知我的ui片段,目前它会尝试关闭对话框。在过去,它通过在onActivityResult上执行回调来解除加载对话框的责任,但它也不起作用

当我的活动在前台时,我可以关闭此对话框,但当我在后台时,我得到一个非法状态异常:OnSaveInstanceEstate后无法执行此操作。我尝试使用onRemove,这不会使我的应用程序崩溃,但也不会隐藏DialogFragment。我已经在我的ui片段和我的活动上做了这两件事,但问题仍然存在

我一直在阅读文档,但找不到可以使用的方法


DialogFragment不应该像我需要的那样使用吗?或者我应该怎么做?

我只是设法用一个肮脏的解决方法来解决这个问题:

我捕获了IllegalStateException并将一个标志设置为true,因此当我的片段返回时,我知道我试图忽略它

//All this code is inside my ui Fragment
@Override
public void onResume() {
    super.onResume();
    final boolean kill = getArguments().getBoolean(ARG_KILL_LOADING, false);
    if ( kill ) {
        final DialogFragment df = ( DialogFragment )
                getFragmentManager().findFragmentByTag( "loading" );
        if ( df != null ) {
            df.dismiss();
        }
    }
}


//Here I got workerfragment result and try to dismiss my DialogFragment
@Override
public void onActivityResult( int requestCode, int resultCode, Intent data ) {

    super.onActivityResult(requestCode, resultCode, data);

    try {
        final DialogFragment df = ( DialogFragment ) getFragmentManager().findFragmentByTag( "loading" );
        if ( df != null ) {
            df.dismiss(); //Let's throw an IllegalStateException if on background!
        }
    } catch( IllegalStateException ex ) {
        //dirty way to avoid crashing while on background:
        //we will ask our ui fragment to dismiss df when ui fragment comes back onResume
        getArguments().putBoolean(ARG_KILL_LOADING, true);
    }

//Do something on ui with workerfragment result

}

但我仍然想知道,在后台时,什么是消除碎片对话框的正确方法。我得到了另一个有同样问题的项目:/

您不需要在onActivityResult中消除片段并捕获异常

只需在ActivityResult中设置您的标志。我使用静态变量

    public class MyFragment extends DialogFragment {
            private static boolean KILL_FLAG = false;

            @Override
            public Dialog onCreateDialog(Bundle savedInstanceState) {
                KILL_FLAG = false;
            }

            @Override
            public void onActivityResult(int requestCode, int resultCode,
            Intent data) {
                    KILL_FLAG = true;
            }

            @Override
            public void onResume() {
                super.onResume();

                if(KILL_FLAG){
                    dismiss();
                }
            }
    }

但是,我的片段对话框应该是我保留的片段(在后台执行任务的片段)的目标,我的对话框将把结果传递给我的ui片段。我说的对吗?您这样做只是为了显示等待\加载对话框吗?为什么要使用onActivityResult?我说得对吗?是的。使用onActivityResult,我从我的工作者片段中获得结果,这样我就可以知道上传是否成功。