【问题标题】:IllegalArgumentException in OTTO when unregistering the fragment注销片段时 OTTO 中的 IllegalArgumentException
【发布时间】:2013-02-06 23:31:14
【问题描述】:

我使用 Otto 总线将事件从活动传递到片段。问题是,片段由ViewPager 管理,并且可以重新创建片段而无需执行其onPause() 和/或onResume()。其令人不快的副作用是,当在onPause() 中调用bus.unregister(fragment) 时,调用会定期失败并出现IllegalArgumentException。我还怀疑可能会错过对我的@Subscribe 注释方法的调用,因为bus.register() 调用在onResume() 方法中,也不能调用。而且,不幸的是,没有bus.isRegistered(fragment) 方法可以进行安全检查。

有没有更好的方法来注册/注销 ViewPager 托管片段?

我知道this post 讨论了类似的设置,但它不包括在 ViewPager 中运行的片段

【问题讨论】:

  • 您使用的是哪个片段寻呼机? FragmentPagerAdapter 还是 FragmentStatePagerAdapter?我问,因为我已经转换为在 onResume 中注册和在 onPause 中取消注册的这种方法,并且没有注意到您使用 FragmentStatePagerAdapter 描述的任何副作用。
  • 另外,也许你在“片段可以在不执行其 onPause 或 onResume() 的情况下重新创建片段”这一行中看到指示“娱乐”的一些信息?我真的不确定如果没有这些电话,娱乐会意味着什么,或者你如何检测到它。
  • 我在写问题时正在使用 FragmentPagerAdapter。现在使用 FragmentStatePagerAdapter 进行测试。当我提到“娱乐”时,我的意思是旧的 Fragment 对象可以被扔掉并看似被另一个对象替换,所以例如我已经学会了不要将任何东西保存为 Fragment 中的字段。似乎同样适用于 onPause/onResume。在处理 ViewPager 和 Fragments 时,很少有问题提到缺少这些调用
  • 我不确定,但这听起来很可疑。我的理解和我的代码库的情况似乎是,当分页片段离开屏幕时,它们会通过其标准生命周期调用被分离。查看FragmentPagerAdapter.destroyItem() 的源代码,有一个对FragmentTransaction.detach 的调用,这将导致Fragment 经历其生命周期。我假设你正在记录 onPause on Resume 并打印出this 这样你就可以看到进行调用的片段的对象ID?
  • 我想我试图暗示问题可能出在其他地方。当我在片段中包含片段或在片段中有 ViewPager 时,我已经看到类似的问题。您是否已更新到最新的支持库?我想我想为您确认我无法重现该问题,因此可能有其他情况因素导致您看到的情况。

标签: android android-fragments android-viewpager otto


【解决方案1】:

如果您因为遇到类似问题而来到这里 - 事实证明(感谢 Nick Campion 指出)我的片段中的 onPause\onResume 没有任何问题。我只是让register/untegister 调用了两次:一次在父抽象类中,另一个在子类中。如class MyFragment extends AbsFragment。所以也许看看你的代码

【讨论】:

    猜你喜欢
    • 2013-11-10
    • 2013-05-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-03
    相关资源
    最近更新 更多