Singleton 是将数据保存在 Android 应用程序内存中的最佳方式吗?

问题描述 投票:0回答:3

我正在构建一个Android应用程序,它有一个类User,用于保存用户的个人资料信息。

创建用户后,它会保存在 SharedPreferences 文件中,以便我可以在下次启动应用程序时加载上次创建的用户。我还有一个 Singleton 类,它保存新创建的用户的对象,以便其他类可以使用它。

我这样做是为了避免每次更改片段并且需要用户时读取 SharedPreferences 文件。

我的问题是:
使用 Singleton 是将变量保存在整个应用程序的内存中的正确方法吗?
是为了这个目的还是有其他方法可以保持面向对象编程原则?
在 Activity 中创建变量而不是使用访问器方法会更好吗?

android singleton
3个回答
2
投票

我会使用以下内容: 接口当前用户。 CurrentUser 有检索和更新用户的方法。用户可以存储在数据库中、偏好或混合中。 我会在需要时使用 Dagger 注入 CurrentUser。 CurrentUser 实现本身应该是单例,因为 Dagger 不保证单例的质量。 如果您的 CurrentUser 有 RxJava 流或 LiveData 之类的东西来让观察者保持最新状态,那就加分了。

作为 Singleton 的替代方案,您可能希望使用保留的片段来实现 Fragment Holder 模式,但在您的情况下,Singleton 似乎更好。只需确保您使用接口和注入不会影响可测试性并保持组件分离。


0
投票

是的,这是更好的方法。最好将数据(正如您提到的情况)保存在 Singleton 对象中,而不是每次都从共享首选项进行访问。我们在应用程序中使用单例用于会话目的,这意味着只要应用程序正在运行,变量数据就可以访问。您可以在活动级别创建变量,但这将是非常糟糕的方法。简而言之,您为达到目的而使用的方法是最好的方法。


0
投票

我知道这是一篇非常古老的帖子,但我不希望其他人,特别是新来者犯这个错误。答案是不。原因是因为 Singleton 与您的应用程序进程绑定在一起,当 Android 系统需要资源并且您的应用程序处于后台或未使用时(例如来自锁定屏幕),它可以随时被 Android 系统杀死。如果您想这样做,那么只需确保在调用或使用它之前重新初始化该单例中使用的所有内容,否则您的应用程序可能会崩溃。该崩溃的另一个问题是它的报告,您很可能会得到一个错误的崩溃报告,指向其他场景,而不是代码中实际的潜在问题,简而言之,这就是代码味道。相反,请使用适当的解决方案,例如本地数据库甚至 SharedPreferences。

TLDR:这是一篇很好的文章,讨论了在 Android 上使用 Singleton 时的其他问题。

© www.soinside.com 2019 - 2024. All rights reserved.