我在manager.popBackStack的行下面收到此错误 . 有没有解决的办法?它恰好发生了 .
public void updateView(Fragment fragment) {
IFragment currentFragment = (IFragment)fragment;
FragmentManager manager = getSupportFragmentManager();
FragmentTransaction fragmentTransaction = manager.beginTransaction();
fragmentTransaction.replace(R.id.content_frame, fragment);
if(currentFragment != null)
{
if(currentFragment.isRoot())
{
manager.popBackStack(null, FragmentManager.POP_BACK_STACK_INCLUSIVE);
}
else
{
fragmentTransaction.addToBackStack("test");
}
}
fragmentTransaction.commitAllowingStateLoss();
if(drawerManager.DrawerLayout != null) {
drawerManager.DrawerLayout.closeDrawer(drawerManager.DrawerList);
}
}
致命异常:java.lang.IllegalStateException:在android.support.v4.app.FragmentManagerImpl.enqueueAction(FragmentManager)的android.support.v4.app.FragmentManagerImpl.checkStateLoss(FragmentManager.java:2044)的onSaveInstanceState之后无法执行此操作.java:2067)位于com.exposure.activities.events的com.exposure.activities.BaseActivity.updateView(BaseActivity.java:239)的android.support.v4.app.FragmentManagerImpl.popBackStack(FragmentManager.java:799) . 位于com.exposure的com.exposure.utilities.ActivityContainer.getData(ActivityContainer.java:83)的com.exposure.activities.events.EventActivity.getData(EventActivity.java:117)中的EventActivity.setupEvent(EventActivity.java:204) .utilities.DataTask.onPostExecute(DataTask.java:37)在android.os.AsyncTask.finish(AsyncTask.java:695)的android.os.AsyncTask.-wrap1(未知来源)android.os.AsyncTask $ InternalHandler . android.os.Looper.lo上android.os.Handler.dispatchMessage(Handler.java:105)的handleMessage(AsyncTask.java:712)位于android.app.ActivityThread.main(ActivityThread.java:6938)的op(Looper.java:164)位于com.android.internal.os.Zygote的java.lang.reflect.Method.invoke(Method.java)$ MethodAndArgsCaller .run(Zygote.java:327)at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1374)
3 回答
如Fragment Transactions & Activity State Loss中的子弹点"Avoid performing transactions inside asynchronous callback methods"所述:
这似乎是您从异步任务调用
updateView()
以来所遇到的问题,但让我们测试一下这个假设 .以下演示应用程序创建一个片段,模拟后台处理和模仿异步回调的回调 . 代码中有一个标志,当设置为true时,
mFixIt
会导致应用程序正常运行(不会爆炸),而当为false时,应用程序会失败 .使用mFixIt == false . 触发器是主页按钮,导致应用程序进入停止状态:
这是堆栈跟踪:
现在
mFixIt
== true . 这次的不同之处在于,当活动处于停止状态时,应用会识别异步回调,记录已发生这种情况,并在重新启动应用时完成处理 . 视觉效果只是按下主页按钮并从"recents"恢复 . 该应用程序只是在开始时放置片段,并在重新启动时更改顶部TextView
文本并从backstack弹出片段 .可以看出,处理按预期完成 .
这是一个微不足道的例子 . 如果您的处理涉及更多,或者您只是想要一种更正式的方式来处理这种情况,我建议您查看this solution .
以下是演示应用的代码:
MainActivity.java
MainFragment.java
main_activity.xml
main_fragment.xml
只需调用 popBackStackImmediate() ,因为常规 popBackStack() 是异步的...
问题主要是:
因此,请在
.updateView()
中查看!isFinishing() && !isDestroyed()
因为这会在
onSaveInstanceState()
上返回true
...类似的情况可以减轻情况,防止崩溃 .