android - 我在android中的模型需要为单例吗?

标签 android model

在我看来,如果您要从不同的活动中访问某些状态或数据(但又不想​​保留),则需要一个单例。这是正确的还是还有其他设计应用程序的方式?

我不是单身人士有问题。我只是在想,因为这与普通的桌面应用程序开发有根本的不同。

最佳答案

您所说的绝对不正确,还有其他设计Android应用程序的方法。

实际上,对于Android开发而言,应避免或谨慎使用Singleton,并且不应将其用作第一个或唯一的解决方案。特别不要使用它在活动之间粗心地共享数据或状态。

如果发现您的应用程序要求所有内容都使用Singleton,则可能是...您需要为应用程序重新设计。

使用Singletons时,实际上需要牢记以下几点:


它们通常存在于应用程序的整个生命周期中,直到系统关闭您的应用程序将它们关闭为止
创建不当的单例很容易泄漏内存
设计不当的Singleton和过度使用Singleton可能会耗尽大量不必要的内存
它们很难用于测试


总体而言,使用Singletons时,您确实需要考虑是否有足够的必要将应用程序的这一部分作为Singleton。

对于大多数情况,答案是否定的。在您提到的情况下,例如在“活动”之间访问状态或数据,是“是”和“否”。

是的,因为需要访问数据可能需要使用Singleton。否,因为不需要访问应用程序的状态。

您对“状态”一词的使用尚不清楚,但是活动实际上应该是自我管理的,因为一个活动的状态不应干扰另一个活动的状态。如果是这样,则有更好的方法将该信息发送到活动(例如,使用Intent Extras),而不是创建一个对所有内容都可以访问且存在时间比应有的时间更长的Singleton。

确实没有什么理由可以保证需要Singleton。

以我的经验,只有两个原因可以允许使用Singleton:


存在单个实例的真正需求
Singleton经常使用,并且不断创建它很昂贵,但是将其保留在内存中不会有任何重大副作用。


例如,SQLite数据库通常用作Singleton,因为数据库的单个同步实例可以帮助防止多个Activity或Service读取/写入数据库。这有助于防止诸如一个对象写入新数据,而另一个对象在写入新数据之前读取旧数据的情况。或者两个对象同时将不同数据写入同一字段的简单情况。

此外,应用程序还经常访问SQLite数据库,因此不断打开数据库,获取某些数据,关闭数据库,打开数据库,写入一些数据,关闭数据库并重复进行操作并没有太大意义。

我已经看到开发人员在很多情况下使用Singletons,其中大多数是出于非常糟糕的原因。

好:


资料库
SharedPreferences(应用需要比平常更频繁地访问首选项)
测井系统


坏处:


我看到开发人员在启动应用程序时加载了大量的Drawables并将其存储在Singleton中……只是为了他可以在任何地方快速使用这些drawables。
我看到一些开发人员使用Singletons来保存已创建的Activity的列表,因此他们可以访问这些Activity的方法和视图...(死)


我看到了更多的坏故事,但现在我不记得了。

另外,请记住,即使我说过将Database之类的东西用作Singleton也是一个好主意,但我只是说它有必要保证使用Singleton。数据库不必是单例的,还有其他解决方案可以更好地适合您的应用程序。

因此,请始终考虑是否需要使用Singleton。

就您而言,其他活动需要访问的状态/数据是否确实需要在应用程序运行期间保持活动状态,并且可以通过以下解决方案来解决:SharedPreferences,Intent Extras,回调接口,数据库,静态类/字段/方法等

如果您已经对应用程序进行了深思熟虑,并且确实认为Singleton将使您的应用程序受益最大,请使用它。不要忘记使用Application Context而不是Activity的Context,因为Singleton肯定会超出Activity的寿命,并且您不希望出现内存泄漏问题。

关于android - 我在android中的模型需要为单例吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54196627/

相关文章:

android - 使 RelativeLayout 不可选择

r - model.matrix 生成的行数比原始 data.frame 少

android - react native ,Android : No resource found that matches the given name 'android:TextAppearance.Material.Widget.Button.Borderless.Colored'

java - 在 ARCore 中访问图像数据字节

Android Studio 找不到参数的方法 runProguard()?

android - 权限仅授予系统应用程序,在 list 中

php - 在 Eloquent 中嵌套一对多关系

ruby-on-rails - 如何创建用于查找 Rails 模型记录的黑名单/白名单?

java - 将数据库模型与网络模型分开

model - 为什么 model.forward(input) 和 model(input) 之间有不同的输出