IllegalStateException:完成AsyncTask&时,片段未附加到Activity。分段

时间:2014-09-18 09:11:31

标签: android android-fragments android-asynctask

我在ProgressDialog中使用AsyncTask。如果用户按下后退按钮,则AsyncTask将被取消,当前片段将被任何其他Fragment替换。

如果用户仍在应用程序上,则没有问题。如果他快速返回并且在最后一次停止申请时,它会给出错误IllegalStateException: Fragment not attached to Activity

如何解决这个问题?

我的代码:

@Override
        protected void onPreExecute() {
            dialog = ProgressDialog.show(getActivity(), "", "Loading...", true,
                    true, new OnCancelListener() {

                        @Override
                        public void onCancel(DialogInterface dialog) {
                            // TODO Auto-generated method stub

                            CancelDialog();
                        }
                    });
        }
public void CancelDialog() {

        new FetchData().cancel(true);

        for (int i = 0; i < fm.getBackStackEntryCount(); ++i) {
            fm.popBackStack();
        }

        ((FrameLayout) flMain).removeAllViews();

        fm.beginTransaction().add(R.id.frame, new Home()).commit();
    }

Home.java:

@Override
    public void onResume() {

        super.onResume();

        getView().setFocusableInTouchMode(true);
        getView().requestFocus();
        getView().setOnKeyListener(new View.OnKeyListener() {

            @Override
            public boolean onKey(View v, int keyCode, KeyEvent event) {
                // TODO Auto-generated method stub

                if (event.getAction() == KeyEvent.ACTION_UP
                        && keyCode == KeyEvent.KEYCODE_BACK) {

                    getView().clearFocus();
                    getActivity().finish();

                    return true;
                }

                return false;
            }
        });
    }

2 个答案:

答案 0 :(得分:1)

经过这么多人的尝试,最后我找到了简单答案:isAdded()
如果Fragment当前已添加到Activity,则返回true。

我使用下面的代码,它解决了我的问题。

@Override
protected void onPostExecute(Void result){
    if(isAdded()){
        // Code to display Data...
    }
}

答案 1 :(得分:0)

在调用例如getActivity()时应该小心 - 当您调用此类方法时,您的片段可能(尚未/已经)附加到活动。查看this.
或者,您可以在调用onAttach时保存Activity实例,但是您必须小心对该Activity实例执行的操作,这样您就不会与另一个实际仍然存在的Fragment进行冲突更新连接。
isAddedisDetached可用于检查状态并避免调用无效方法。