我在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;
}
});
}
答案 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进行冲突更新连接。
isAdded和isDetached可用于检查状态并避免调用无效方法。