java - 在 fragment 生命周期中跟踪对象实例

标签 java android android-fragments singleton

我对 Android Fragment 有一个非常具体的问题。我读过很多关于如何持久存储数据的文章,但没有一个解决方案完全符合我的需求。

我有一个自定义类 RpgChar(代表 RPG 角色及其统计数据),并且想要编写一个 fragment 来显示其中一个统计数据(例如,当前的生命值)。要显示哪些统计数据(甚至操作)应该是灵活的,因此 fragment 是最佳选择。 Fragment 中的 TextView(或其他内容)必须链接到 RpgChar 中的相应字段。使用 PropertyChangeListener 很容易做到。

现在的问题是 fragment 不断被破坏和构建。创建 RpgChar 实例是由该 Activity 完成的。我当然可以最初将它传递给 Fragment,但是我如何跟踪它?

到处指出的第一个解决方案就是将其放入 Bundle 中。首先,RpgChar 进行文件处理,据我所知,使其可序列化或可解析是一个真正的麻烦。此外,如果加载新角色,则必须为每个 fragment 手动完成更改。

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

我非常感谢上述想法或全新想法的任何优点或缺点。我正在寻找一种安全的解决方案,因为我不需要做太多事情来确保每个 fragment 都有正确的实例来跟踪。同时我也不喜欢过多地破坏我的代码。甚至可能存在我不知道的针对这些情况的标准做法?

PS:如果需要的话,我稍后会提供一些代码示例,现在我会再谷歌一些,然后喝醉。 :)

最佳答案

你写道:

First of, RpgChar does file handling, so as far as I know making it Serializable or Parcelable is a real hassle

好吧,请记住这里的 SRP(单一职责原则)。 RpgChar 对象除了代表 Rpg 角色绝对必要的内容外,不应该做任何其他事情。文件处理是一个不同的问题。您可以(并且可能应该)做的是创建另一个类,例如 RpgCharHandler (或类似),其唯一职责是保存/加载 RpgChar 对象。这不仅是一个更正确的方法,而且您还赢了,因为您没有在 RpgChar 对象上实现 Serialized 或 Parcelable 。

我当然不会推荐这里的单例模式。你已经写了一些缺点。此外,根据您的类所持有的引用,如果这些引用(与 View 、 Activity 等相关)在 Android 尝试销毁它们所属的 Activity 后仍保持 Activity 状态,则可能会导致内存泄漏。

现在您还可以做的就是根本没有任何 fragment 来完成您想要用它们做的事情(我基于您在原始帖子下面的评论)。相反,如果您只想要一些可见/不可见元素,您可以回退到以编程方式切换它们的可见性。当然,您在这里会失去一些灵 active ,但如果确实只有少量受影响的元素,那么它是一个可行的替代方案。

关于java - 在 fragment 生命周期中跟踪对象实例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28119646/

相关文章:

java - 创建 YouTubePlayerView 时出错

java - Android studio fragment 或新 Activity

android - 安全异常 : Permission denied (missing INTERNET permission? )

android - Layout Inflater 膨胀 EditText 时有趣的线程行为

java - Spring Data - 自定义查询 : count and list

java - Android context.getResources.updateConfiguration() deprecated 如何解决?

java - 连接到数据库的 RESTful Web 服务,实体管理器为空

java - 有什么方法可以搜索,然后从 String 中调用 java 中的方法?

java - 有意以 int 形式发送到另一个 Activity 的 ID 始终为零

java - 从另一个 fragment 调用一个 fragment ,然后替换其布局