管理全局对象或列表

时间:2017-04-22 05:42:31

标签: java android memory-management singleton

我已经阅读了很多关于单身人士如何在android中易受攻击的博客。所以我的问题是如何在应用程序中维护这样的全局对象或列表。我知道共享偏好是一种方式,但有没有办法有效地维护这些对象或列表任何帮助都会更有帮助。

9 个答案:

答案 0 :(得分:1)

您可以使用文件或SQLite数据库在Android应用中保存数据。您可以查看以下链接,了解有关在文件或SQLite数据库中保存数据的更多信息:

将数据保存到文件非常适合存储通常按顺序读取的长序列数据 https://developer.android.com/training/basics/data-storage/files.html

将数据保存到数据库是重复或结构化数据的理想选择: https://developer.android.com/training/basics/data-storage/databases.html

答案 1 :(得分:1)

使用sharedPreferences,Sqlite数据库来管理你的对象,单例不是很好,但是静态变量更难以维护并且会使测试更加困难,如果数据是,你可以使用Shared偏好来维持全局状态不是很大,如果有大量数据,建议使用sqlite。

共享首选项非常易于使用,如果您在使用sqlite时遇到问题,尽管您可以使用orm库来安装 这是指向http://greenrobot.org/greendao/

的链接

答案 2 :(得分:0)

如果您只想将列表保持为全局列表,直到您的应用运行,那么创建一个新类,让我们说" Helper"并在该类中初始化静态列表。现在,您可以通过" Helper.yourStaticListName"在应用程序内的任何位置访问该列表。您还可以在应用内的任何位置添加/删除或从列表中获取数据。 但是,如果您想要在应用程序关闭时保留该列表,那么有两种解决方案。 首先创建一个本地数据库" SQLite文件"在您的应用中添加/删除或从中获取数据。

查看本教程:http://www.androidhive.info/2011/11/android-sqlite-database-tutorial/

第二个解决方案是将您的数据转换为JSON并将该JSON转换为String并将其保存在共享首选项中。无论什么时候需要它,只需从共享首选项中获取字符串并将其转换为JSON并解析以获取数据。 当你谈论解析JSON时,最后一件事是" GSON库"是一件好事。

以下是链接:http://guides.codepath.com/android/leveraging-the-gson-library

希望这个答案能帮到你。

答案 3 :(得分:0)

如何使用Android Service

您可以在应用程序启动时初始化/启动它(并在应用程序停止时停止它们),然后在需要时随时bind(放置并获取对象/列表)。

我相信这将是一种有效的方式。

答案 4 :(得分:0)

从概念角度看,拥有静态变量或服务定位器与拥有单身人士非常相似。因此,如果目的是避免全球状态和后果,将它们作为替代方案可能不正确。

我们可以将Singleton-classes更改为实例,这些实例仅实例化一次并根据需要注入组件和方法。我们可以使用IoC框架来处理注入部分,或者使用工厂模式手动执行它来构造(我们也可以只限制一个实例创建)类的实例。这个discussion thread提供了很多关于问题和各种选项的见解。

答案 5 :(得分:0)

因此,如果我理解您的问题,您需要在整个应用程序中存储一些全局变量,如果是这样,那么请查看this question

基本上你创建了一个扩展应用程序的类,它可以在你的应用程序启动时存储你想要的任何东西,所有这些都可以通过应用程序访问。

希望这会有所帮助。

答案 6 :(得分:0)

如果您正在尝试创建一个全局可访问的对象,您首先应该问自己:为什么?为什么需要全局可访问的对象?大多数情况下,您没有,并且您可以创建一个具有有限范围的对象,该对象在应用程序周围传递。

有时您确实需要全局可访问的资源,而使用单例只是实现此目的的一种方法。根据{{​​3}}您的数据存储选项是:

共享偏好设置

将私有原始数据存储在键值对中。

内部存储

将私人数据存储在设备内存中。

外部存储空间

将公共数据存储在共享外部存储上。

SQLite数据库

将结构化数据存储在私人数据库中。

网络连接

使用您自己的网络服务器在网络上存储数据。

单身人士很棒,但根据他们的实施方式确实存在风险。通常,当您尝试在应用程序内共享资源时,开发人员会使用此模式,例如LoggersPrint spoolers等。您可以通过多种方式在Java中创建Singletons,可以使用惰性初始化或静态初始化,每个都有自己的优点/缺点。就“漏洞”而言,单例是否是线程安全的,是谁/什么可以访问它等等都存在问题。这就是为什么尝试理解您要解决的问题是有道理的。就个人而言,我不清楚你究竟想要解决的是什么,所以我无法详细说明这可能对你有什么帮助或伤害。我只能说,最大的漏洞也是它最大的资产,就像大多数全局变量一样,它可以随时随地访问。单例是否是线程安全的也可能存在问题。

就个人而言,我认为您需要评估您要解决的问题并选择合适的解决方案。也许使用单身是正确的解决方案,也许不是。但了解所有选项以及每个选项的优缺点将是解决此问题的最佳方法。不幸的是,您没有为我或任何人提供足够的上下文来为您提供可靠的建议。

答案 7 :(得分:0)

管理全局对象的最佳方法是根本没有它们。根据我的经验,在很多情况下,有替代选项而不是使用单身人士。有如此好的解释in this post

答案 8 :(得分:0)

共享首选项是好的,但有时候你会在一个pojo java类中进行一些修改时产生静态常量变量并在任何地方使用这个变量时会感到有问题。因为共享首选项在使用后不会改变值,或者除非你修改.shared偏好检索和存储不是非常不友好。如果你使用常数,你可以很容易地修改。只需要一个你要打的课