跟踪片段生命周期中的对象实例

时间:2015-01-23 22:17:46

标签: java android android-fragments singleton

我有一个非常具体的问题与android片段。我已经阅读了一些关于如何持久存储数据的内容,但没有一种解决方案能够满足我的需求。

我有一个自定义类RpgChar(表示带有它的统计数据的RPG角色),并且想要写一个片段来显示其中一个统计数据(比如当前的健康点)。要显示哪些统计信息(甚至是操作)应该是灵活的,因此碎片是可行的方法。片段中的TextView(或其他)必须链接到RpgChar中的相应字段。使用PropertyChangeListeners很容易。

现在麻烦的是片段被不断破坏和构建。创建RpgChar实例由活动完成。我当然可以将它最初传递给Fragment,但我该如何跟踪呢?

到处指出的第一个解决方案就是把它放到Bundle中。首先,RpgChar进行文件处理,因此据我所知,将Serializable或Parcelable作为一个真正的麻烦。此外,如果加载了新字符,则必须手动为每个片段完成更改。

我的第二个想法就是让RpgChar像单身一样。我已经有一个带有静态工厂方法的工厂类RpgChars。我可以让这个类跟踪一个RpgChar实例。要么我把它变成一个真正的单例,这很烦人,因为我必须修改现有的实例,而不是简单地创建一个新实例。或者我创建了新实例。更容易做,但我可能会参考某处的旧角色。

我非常感谢上述观点或全新观点的任何利弊。我正在寻找一个安全的解决方案,因为我没有太多工作要做,以确保每个片段都有正确的实例来跟踪。与此同时,我不喜欢夸大我的代码。对于这些情况,我甚至不知道有一个标准的做法吗?

PS:如果需要,我稍后会提供一些代码示例,现在我会更多地谷歌并喝醉。 :)

1 个答案:

答案 0 :(得分:1)

您写道:

  

首先,RpgChar进行文件处理,因此据我所知,将其设置为Serializable或Parcelable是一件非常麻烦的事情

嗯,请记住这里的SRP(单一责任原则)。一个RpgChar对象不应该做任何其他事情,但代表一个Rpg角色绝对必要的东西。文件处理是一个不同的问题。您可以(也可能应该)做的是创建另一个类,如RpgCharHandler(左右),其唯一的责任是保存/加载RpgChar对象。这不仅是一种更正确的方法,而且你也赢了,你没有在你的RpgChar对象上实现Serializable或Parcelable。

我当然不会在这里推荐单身人士模式。你已经写了一些缺点。此外,根据您的类所包含的引用,如果在Android尝试销毁它们所属的活动后,这些引用(与视图,活动等相关的参数)保持活动状态,则可能导致内存泄漏。

现在您还可以做的就是根本没有任何片段用于您想要用它们做什么(我的评论基于您原始帖子下方的评论)。相反,如果您只想要一些可见/不可见的元素,您可以回退以编程方式切换其可见性。当然,你在这里失去了一些灵活性,但如果它只是少数受影响的元素,那么它是一个可行的选择。