java - 如何在 Android/Java 中保存数据对象?

标签 java android model-view-controller

我是一名电脑爱好者,正在为 Android 平台开发一款非常小的问答游戏。

在这个游戏中,我在多个 Activity/ View 页面(条目、问题页面、答案页面、最终得分页面)之间移动玩家。我创建了一个问题对象,其中包含与单个琐事问题相关的所有数据(问题、四个答案、指向正确答案的指针、计算机在响应玩家的猜测时做出的相关评论),并且我已成功填充一个 ArrayList Question 对象以及我从 XML 文件中解析出的 DOM 数据。

随着游戏的进行,在 Activity 之间来回传递这些数据的可接受的方式是什么?当用户在游戏中移动时,如何使这些数据对象保持 Activity 状态?

据我了解,强烈建议不要使用全局变量。我还了解到,单例设计模式提出了许多据说与全局变量相关的问题。当我要寻找这些方法的替代方案时,我感到很困惑。

我了解 MVC 方法的基础知识。我的 Activity *.java 文件是 Controller 文件,它们链接到我使用 XML 创建的布局( View )。我有两个“模型”对象需要随着游戏的进展进行维护和修改:(1)上面提到的问题库 ArrayList 和(2)某种“PlayerProgress”对象,其中包含与玩家进度相关的所有数据游戏。

这些数据对象首先在游戏开始时实例化,但我不知道当用户在 Activity 之间移动时如何使它们保持 Activity 状态。我知道我可以作为 EXTRAS 在 Activity 之间传递信息,但 EXTRA 似乎并非用于此目的。即使 EXTRAS 适用于玩家进度属性,我也不认为我可以使用它们在 Activity 之间传递包含 25-50 个问题对象的 ArrayList。

我已经研究了序列化和可打包,但每次用户在不同的 Activity/ View 之间来回移动时基本上分解然后重新组合我的数据模型对象似乎很奇怪(并且可能效率低下)。如果其中一个是实现这一目标的可接受/常见的方法,我可以很高兴地继续前进,但我想先与其他人核实。

我一直用不同的编程语言来反对这个问题,并怀疑有一些更大的部分我无法理解。我已经阅读了许多不同资源中的对象和应用程序生命周期的描述,但我仍然没有找到这个基本问题的解决方案。

我在我愚蠢的问答游戏的背景下问这个问题(“随着游戏的进展,在 Activity 之间来回传递数据对象的可接受的方式是什么”),但我真的很关心如何获取句柄在更大的图景上。如果人们没有时间阐明如此看似基本的内容,也许您可​​以向我指出您认为有用的其他书中的描述? (我的 Safari 书架上有几个空位,可以找到几乎所有技术出版物的副本。)

谢谢。

最佳答案

我没有获得足够的票数来直接回答 323go 关于静态变量的帖子...但该实现正是 Singleton。我想指出这一点是因为您在问题中指出您还了解到单例设计模式带来了许多据称与全局变量相关的问题

我承认,如果您习惯于调用内联参数的函数或程序,那么第一次使用 extras 会很奇怪,但这似乎是 Android 中的常用方式。 我不明白使用额外功能有什么问题,因为如果您的模型对象不是很复杂,那么它对您来说几乎是透明的。我的意思是你只需要实现“Serialized”接口(interface)就可以了。有些数据类型不能“单独”与 Serialized(如列表)一起使用,您需要实现 Parcelable,但您可以声明插入的数组。看来 Parcelable 是“效率更高”,所以如果你想要更好的性能,你无论如何都需要实现 Parcelable,正如有人在这里所说的: Android: Difference between Parcelable and Serializable?

我不认为共享首选项旨在用作“传递参数工具”,因为它不会那么有效,因为它必须写入和读取物理内存,这在过去是“艰巨的工作”任何计算机系统;而 exras 将通过内存堆栈发送(免责声明:我没有测试,但这是逻辑告诉我的)。我使用 dannyroa 的方式(存储 json 对象)来解决用户偏好、互联网检索的几乎没有更新的数据、评分、保存游戏等持续时间问题......

最后...也许您可以重组您的代码。您是否正在为每个问题打开一个新 Activity ?也许您可以只使用一个 Activity 并使用 fragment 。然后,您可以在 Activity 中拥有全局变量,并且其中的任何 fragment 都可以使用 getActivity() 访问那里。

((MyActivity)getActivity()).myGlobalVariable();

关于java - 如何在 Android/Java 中保存数据对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17661094/

相关文章:

javascript - 从 ember.js 中的内部函数创建 View 时访问对象内容

java - 将 Swift 数据转换为 Int16

java - 无法在某部手机上安装 apk

android - 应用程序未针对 Google Play 上的 Alpha 测试人员进行更新

PHP MVC : Where to Put Dynamically Generated Javascript

java - spring mvc hibernate中如何从表单获取数据并将其存储在多个表中

java - 获取得分为 "x"分的学生列表 Java8 List<Student> 到 Map<Marks,List<Name>>,限制名称数量

Java - 似乎无法按照方程的路径在屏幕上绘制文本

android - 在android中启动项目时出错

带有 Nexus 6 的 Android——如何避免与应用焦点相关的 OpenSL 音频线程优先级降低?