如何在Android / Java中保留数据对象?

我是一个计算机爱好者,正在为Android平台开发一个非常小的琐事游戏。

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

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

我理解全球变量都非常沮丧。 我还了解到,Singleton设计模式提出了许多与全局变量相关的问题。 在找到这些方法的替代方案时,我很难过。

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

这些数据对象首先在游戏开始时实例化,但我不知道如何在用户在活动之间移动时保持它们存活。 我知道我可以在活动之间传递信息作为EXTRAS,但EXTRA似乎并不是为了这个目的。 即使EXTRAS为播放器进度属性工作,我也不认为我可以使用它们在活动之间传递25-50个问题对象的ArrayList。

我已经研究过序列化和parcelable,但是每当用户在不同的活动/视图之间来回移动时,基本上分解然后重新组合我的数据模型对象似乎很奇怪(并且可能是低效的)。 如果其中一个是可接受/通用的方法来实现这一点,我可以愉快地向前冲,但我想先与其他人核实。

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

我问这个问题(“在游戏进行过程中,在活动之间来回传递数据对象的可接受方式是什么”)在我愚蠢的琐事游戏的背景下,但我真的很关心如何处理更大的问题图片。 如果人们没有时间拼出看似基本的东西,或许你可以指点我在其他书中找到你认为有用的描述吗? (我的Safari书架上有几个插槽,可以追踪几乎所有技术出版物的副本。)

谢谢。

我没有足够的票数在323go关于静态变量的post中直接回答……但是这个实现恰好是Singleton 。 我想指出这一点,因为你在问题中说过,你还了解到Singleton设计模式带来了许多与全局变量相关的问题

我承认,如果你习惯用内联参数来调用一个函数或一个程序,那么额外的内容是非常奇怪的,但它似乎是Android中的常用方法。 我没有看到使用extras的问题是什么,因为如果你的模型对象不是很复杂,它对你来说几乎是透明的。 我的意思是你只需要实现“Serializable”界面就可以了。 有一些数据类型不能单独使用Serializable(作为列表),你需要实现Parcelable,但你可以声明insted数组。 似乎Parcelable“ 效率更高 ”,所以如果你想要更好的表现,你还需要实现Parcelable,就像有人在这里说的那样: Android:Parcelable和Serializable之间的区别?

我不认为共享首选项旨在用作“传递参数工具”,因为它不会像写入和读取物理内存那样高效,在任何计算机系统中使用什么都是“辛苦工作” ; exras将通过内存堆栈发送(免责声明:我没有测试,但这是逻辑告诉我的)。 我使用dannyroa的方式(存储json对象)作为用户首选项,互联网检索的几乎没有更新数据,scorings,存档游戏等时间问题。

最后……也许你可以重组你的代码。 您是否为每个问题开设了新活动? 也许你只能使用一个Activity并使用片段。 然后,您可以在活动中拥有全局变量,并且内部的任何片段都可以使用getActivity()访问它。

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

您可以在Intent Extras中放置一组parcelable对象,这样就可以在活动之间发送一个parcelable问题对象数组。

我个人使用sqlite数据库存储问题,并通过内容提供商从数据库中提取问题。

对于您当前的应用程序可能有点过分,但如果您扩展了问题集,则可以更改SQL以为每个活动提取相关的问题子集。

我尝试过将它们保存在SharedPreferences中。

为了保存对象,我使用Gson库将其转换为JSON字符串并将JSON字符串转换回对象。

但是,这意味着它只适用于Serializable对象,并且从SharedPreferences读取和写入会产生开销。

理想的解决方案是全局静态和SharedPreferences的组合。 如果静态变量为null,则从SharedPreferences获取它。 确保在更新SharedPreferences中的值时清除静态变量。

 static String userInfo = null; public static String getUserInfo() { if (userInfo != null) { return userInfo; } return _getStringFromPref("userInfo"); } public static String setUserInfo(String val) { _putStringToPref("userInfo", val); userInfo = val; //or you can just set userInfo to null; } 

您还可以使用本地数据库(sqlite)而不是SharedPreferences。

在我原来的post中,我答应在调查所有选项后回过头来。

只想报告最简单的解决方案,正如Ender建议的那样,是使用多个片段和单个活动页面。 这使得完全避免全局静态对象成为可能,因为所有片段都可以访问MainActivity类。