我对android Fragment有一个非常特定的问题。我已经阅读了很多有关如何持久存储数据的信息,但是没有一种解决方案完全符合我的需求。
我有一个自定义类RpgChar(代表RPG角色及其统计信息),并且想编写一个Fragment来显示这些统计信息之一(例如,当前的健康状况)。要显示的统计信息(甚至动作)应该很灵活,因此使用分段是可行的。 Fragment中的TextView(或其他内容)必须链接到RpgChar中的相应字段。使用PropertyChangeListeners轻松完成。
现在的麻烦是片段不断被破坏和构建。创建RpgChar实例由活动完成。我当然可以先将其传递给Fragment,但是如何跟踪它?
到处都指出的第一个解决方案是将其放入捆绑包中。首先,RpgChar会进行文件处理,据我所知,将它序列化或可打包是一个真正的麻烦。同样,如果加载了新字符,则必须为每个片段手动进行更改。
我的第二个想法是使RpgChar类似单例。我已经有一个带有静态工厂方法的工厂类RpgChars。我可以让此类跟踪一个RpgChar实例。我要么使它成为一个真正的单例,但这很烦人,因为我必须修改现有实例,而不是简单地创建一个新实例。或者我让它创建新实例。这样做比较容易,但是我可能会引用某个地方的旧字符。
对于上述想法的利弊或全新想法,我将不胜感激。我正在寻找一种安全的解决方案,因为我没有太多事情可以确保每个片段都有正确的实例进行跟踪。同时,我不想过多地破坏我的代码。对于这些情况,可能甚至没有我不知道的标准做法吗?
PS:如果需要的话,我将在以后提供一些代码示例,现在,我将在Google上搜索更多内容并喝醉。 :)
最佳答案
你写了:
首先,RpgChar会进行文件处理,据我所知,将其序列化或可打包是一个真正的麻烦
好吧,请记住此处的SRP(单一责任原则)。 RpgChar对象不应执行任何其他操作,而应代表Rpg角色绝对必要的操作。文件处理是另一个问题。您可能(可能应该)要做的是创建另一个类,例如RpgCharHandler(或类似类),唯一的责任是保存/加载RpgChar对象。不仅这是一种更正确的方法,而且您还会赢得没有在RpgChar对象上实现Serializable或Parcelable的优势。
我当然不会在这里推荐单例模式。您已经写了一些缺点。此外,根据类持有的引用,如果这些引用(与诸如Views,Activities之类的内容相关)在Android尝试销毁它们所属的活动后仍保持活动状态,则可能导致内存泄漏。
现在,您还可以做的是根本不用碎片处理这些碎片(我将其根据您原始帖子下方的评论)。相反,如果只希望某些可见/不可见元素,则可以通过编程方式切换到可见性。当然,您在这里会失去一些灵活性,但是如果实际上只是少数受影响的元素,那么它是可行的选择。