为了账号安全,请及时绑定邮箱和手机立即绑定

Android中的单身汉与应用上下文?

Android中的单身汉与应用上下文?

元芳怎么了 2019-06-18 15:50:00
Android中的单身汉与应用上下文?回顾这一点后列举使用单子的几个问题看过几个使用单例模式的Android应用程序的例子后,我想知道使用单例而不是通过全局应用程序状态共享的单个实例(子类为android.os.Application并通过context.getApplication()获得它)是否是个好主意。这两种机制有哪些优点/缺点?老实说,我希望在这篇文章中得到同样的答案。单例模式与Web应用程序,不是一个好主意!但适用于安卓系统。我说对了吗?否则,DalvikVM有什么不同?编辑:我想就以下几个方面发表意见:同步可重用性测试
查看完整描述

3 回答

?
守着星空守着你

TA贡献1799条经验 获得超8个赞

我非常不同意戴安·哈克伯恩的回答。我们一点地从我们的项目中移除所有的单点对象,以支持轻量级的、任务范围的对象,当您实际需要它们时,这些对象可以很容易地重新创建。

单节点是测试的噩梦,如果初始化延迟,将引入“国家不确定性”具有微妙的副作用(当将调用转移到getInstance()从一个范围到另一个范围)。可见性被提到了另一个问题,因为单例意味着“全局”(=随机)访问共享状态时,当并发应用程序中不正确同步时,可能会出现微妙的bug。

我认为这是一种反模式,这是一种糟糕的面向对象的风格,本质上相当于维护全球状态。

回到你的问题上:

虽然应用程序上下文可以被认为是单例,但它是由框架管理的,并且有一个很好的定义。生命周期、范围和访问路径。因此,我认为,如果你真的需要管理应用-全球状态,它应该去这里,没有其他地方。再考虑一下真的需要一个单例对象,或者也可以重写您的单例类来实例化执行手头任务的小的、短命的对象。


查看完整回答
反对 回复 2019-06-18
?
慕沐林林

TA贡献2016条经验 获得超9个赞

我非常推荐单身人士。如果您有一个需要上下文的单例,请具有:

MySingleton.getInstance(Context c) {
    //
    // ... needing to create ...
    sInstance = new MySingleton(c.getApplicationContext());}

我更喜欢单身汉而不是应用程序,因为它有助于保持应用程序更有组织性和模块化-而不是有一个需要维护整个应用程序的全球状态的地方,每个单独的部分都可以自己处理。另外,在Application.onCreate()中,单例延迟初始化(应请求)而不是引导您执行所有初始化的路径也是好的。

使用单子没有本质上的错误。只要正确地使用它们,当它有意义的时候。Android框架实际上有很多,因为它可以维护每个进程缓存的加载资源和其他类似的东西。

对于简单的应用程序,多线程不会成为单线程的问题,因为通过设计,对应用程序的所有标准回调都被分派到进程的主线程上,所以除非通过线程显式地引入多线程,或者通过将内容提供程序或服务IBinder发布到其他进程,否则不会发生多线程。

想想你在做什么就行了。*)


查看完整回答
反对 回复 2019-06-18
?
BIG阳

TA贡献1859条经验 获得超6个赞

来自:开发人员>参考-应用程序

通常不需要子类应用程序。在大多数情况下,静态单节点可以更模块化的方式提供相同的功能。如果您的单例需要全局上下文(例如注册广播接收器),那么检索它的函数可以在第一次构造单例时在内部使用Context.getApplicationContext()。


查看完整回答
反对 回复 2019-06-18
  • 3 回答
  • 0 关注
  • 438 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信