OTTO中注销fragment时出现IllegalArgumentException异常

3
我使用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 没有注意到你描述的任何副作用。 - Nick Campion
另外,也许可以提供一些关于“重建”在“片段可以在不执行其onPause或onResume()的情况下被重建”的线路中表示什么的信息?我真的不确定如果没有这些调用,“重建”会意味着什么,或者你如何检测它。 - Nick Campion
@NickCampion 这个怎么帮助我解决这个具体的问题呢?到目前为止,我只是在有问题的代码周围加了 try/catch,但这只是掩盖了问题。 - Bostone
1
我想我试图表明问题可能出现在其他地方。当我在片段内部有碎片或者ViewPager在一个片段中时,我曾经看到类似的问题出现过。你是否已经更新到最新的支持库?我想我试图为你确认,我无法重现这个问题,所以可能有其他情况因素导致你所看到的情况。 - Nick Campion
你说得对,Nick。事实证明我是个完全忘记了我已经在抽象类中注册/注销的白痴。所以注销被执行了两次,这就是失败的原因。非常感谢你让我思考! - Bostone
显示剩余3条评论
1个回答

1
如果您来到这里是因为有类似的问题 - 原来(感谢Nick Campion指出)我的片段中没有onPause\onResume问题。我只是在父抽象类和子类中分别调用了register/untegister两次。就像class MyFragment extends AbsFragment一样。因此,请检查您的代码。

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