3

应用程序崩溃,当我打开服务器RPC时,以及RPC正在进行时,我将应用程序放在后台。同时,当RPC从服务器获得响应时,它从堆栈中弹出一个片段。在弹出片段时,应用程序崩溃。 我已阅读有关创建WeakReference的信息,如果活动被破坏,它将为空。但不知道如何实施这种情况。当从栈中弹出一个片段时,应用程序在后台崩溃

以下是我的代码:

private void showFragment(SherlockFragment fragment) { 
    FragmentManager fm = getSupportFragmentManager(); 
    fm.popBackStack(null, FragmentManager.POP_BACK_STACK_INCLUSIVE); 
    FragmentTransaction ft = fm.beginTransaction(); 
    ft.replace(R.id.content, fragment); 
    ft.commit(); 
} 

我得到一个崩溃上执行以下行:

fm.popBackStack(null, FragmentManager.POP_BACK_STACK_INCLUSIVE);

堆栈跟踪:

01-15 16:37:44.435: E/AndroidRuntime(28049): FATAL EXCEPTION: main 
01-15 16:37:44.435: E/AndroidRuntime(28049): java.lang.IllegalStateException: Can not perform this action after onSaveInstanceState 
01-15 16:37:44.435: E/AndroidRuntime(28049): at android.support.v4.app.FragmentManagerImpl.checkStateLoss(FragmentManager.java:1299) 
01-15 16:37:44.435: E/AndroidRuntime(28049): at android.support.v4.app.FragmentManagerImpl.enqueueAction(FragmentManager.java:1310) 
01-15 16:37:44.435: E/AndroidRuntime(28049): at android.support.v4.app.FragmentManagerImpl.popBackStack(FragmentManager.java:452) 
01-15 16:37:44.435: E/AndroidRuntime(28049): at com.druva.inSync.ValidationActivity$2.run(ValidationActivity.java:93) 
+1

搜索'无法执行onSaveInstanceState'后这个动作,你会得到很多很多的答案, –

+0

或只需按照相关的问题 –

+0

我做检查相关问题。我尝试使用“commitAllowingStateLoss”,我也试着检查“activity.isFinishing”。该控件不会去'isFinishing',并且因为我在ft.commit()之前发生崩溃,所以commitAllowingStateLoss也没有帮助。 –

回答

1

我有完全相同的问题,我用一个标志解决了这个问题。这似乎有点“哈克”,但它的工作

public abstract class PopActivity extends Activity { 

    private boolean mVisible; 

    @Override 
    public void onResume() { 
     super.onResume(); 
     mVisible = true; 
    } 

    @Override 
    protected void onPause() { 
     super.onPause(); 
     mVisible = false; 
    } 

    private void popFragment() { 
     if (!mVisible) { 
      return; 
     } 

     FragmentManager fm = getSupportFragmentManager(); 
     fm.popBackStack(null, FragmentManager.POP_BACK_STACK_INCLUSIVE); 
    } 
} 

所以当您在恢复应用程序单独实现上述代码,你会发现自己在你真的想被弹出一个片段。您可以使用下面的剪断来解决这个问题:

public abstract class PopFragment extends Fragment { 

    private static final String KEY_IS_POPPED = "KEY_IS_POPPED"; 
    private boolean mPopped; 

    @Override 
    public void onSaveInstanceState(Bundle outState) { 
     outState.putBoolean(KEY_IS_POPPED, mPopped); 
     super.onSaveInstanceState(outState); 
    } 

    @Override 
    public void onCreate(@Nullable Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     if (savedInstanceState != null) { 
      mPopped = savedInstanceState.getBoolean(KEY_IS_POPPED); 
     } 
    } 

    @Override 
    public void onResume() { 
     super.onResume(); 
     if (mPopped) { 
      popFragment(); 
     } 
    } 

    protected void popFragment() { 
     mPopped = true; 
     // null check and interface check advised 
     ((PopActivity) getActivity()).popFragment(); 
    } 
} 
+1

由于onCreate方法在片段回到前台时未调用,因此存在问题 –

相关问题