屏幕方向改变时的处理方式,片段事务,活动已被销毁,弱引用。

3
好的。这是我的第一个问题。我已经找到了一些解决方案,但老实说并没有真正理解背后发生的事情。也许有人能帮我澄清一下这个问题。经过几天的调试,我很高兴它能正常工作......希望我没有犯什么严重的错误。那我们来看看吧。
我有一个主要的活动(Main-Activity)。只是一个扩展JFeinstein的SlidingFragmentActivity的FragmentActivity。进一步地,我决定采用片段(fragment)的方式,将任何内容(列表片段、文章片段等)作为片段放入容器中(滑动菜单右侧);我的主容器(main-container)。到目前为止,还不错。
一个重要的片段(fragment)是我的文章片段(article-fragment)。一个ViewPager(带有一个FragmentStatePagerAdapter)- 包含一些页面和可能另一个列表片段。直到我决定旋转设备,还没有出现问题。更确切地说,只要我不决定更新我的文章片段,旋转设备也能正常工作。
我理解(如果我错了,请纠正我),当旋转设备时,Android会自行处理片段(fragment)的状态。似乎一切都很好,直到我想重新加载/更新它的内容。
好吧,让我们深入了解一下。 第一次启动时,我有一些空的主容器(main-container)。然后我第一次加载我的文章片段(article-fragment)。只是获取SupportFragmentAdapter,创建我的ArticleFragment并用新创建的片段替换主容器(main-container) - 打上标签。没有什么难度——只是一个简单的事务:
ViewPagerFragment pagerFragment = (ViewPagerFragment) 
    getSupportFragmentManager().findFragmentByTag(TAG_FRAGMENT_ARTICLE);

if(pagerFragment != null){
    if(pagerFragment.isResumed()){
        pagerFragment.triggerReload();
    }
} else {
    pagerFragment = new ViewPagerFragment();
    FragmentTransaction t = getSupportFragmentManager().beginTransaction();
    t.replace(R.id.id_main_root_frame, pagerFragment, TAG_FRAGMENT_ARTICLE);
    t.commitAllowingStateLoss();
}

为避免每次重新加载内容时都创建一个片段,我试图在事务之前获取片段,如果找到并恢复,则在现有片段上触发一些重新加载操作。
现在我在这种状态下旋转我的设备。为了避免干扰片段状态,我将 onSaveInstanceState() 保留在片段内部不变。因此,我想片段仅仅被销毁并重新创建。到目前为止一切都还可以,但是我认为这部分有点黑盒子性质。
在此之后 - 正常启动、创建片段并放入主容器、旋转设备 - 我触发了一些更新。但是没有找到旧的(重新创建的)片段标签,而是创建并插入了一个新片段。至少尝试插入,因为这就是我得到以下异常的地方:
java.lang.IllegalStateException: Activity has been destroyed

准确地说,当我使用commitAllowingStateLoss()完成事务时,会出现上述异常。当我只使用commit()提交事务时,会出现以下异常:

java.lang.IllegalStateException: Can not perform this action after onSaveInstanceState

所以这就是错误出现的地方。经过漫长的调试和搜索,我在这个问题/答案上找到了一些关于在MainActivity的WeakReference上获取SupportFragmentManager的提示。说实话,自从我实现了这个之后,它就能正常工作了。我不得不稍微改变我的更新过程,但它可用了。但是还有一些疑问...
行为似乎是相似的。第一次创建完美运行。重新加载 - 片段仍然可以通过标记找到。旋转后,文章仍然显示。当我使用该状态重新加载片段时,它无法通过标记找到,因此会创建一个新的片段,但commit()请求不会引发异常。调试器中的查看显示,WeakReference是另一个实例(其他ID),而不是其中的一个(此)发生所有这些事情。这就是我失去情节的地方...
如果有人能给我一些提示,那就太棒了! 提前感谢!

我遇到了完全相同的问题,但是我一点也不知道为什么会出现这种情况。非常令人沮丧,因为没有任何文档可以参考。 - dcow
1个回答

0

试试这个:

commitAllowingStateLoss(); instead commit();

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接