【问题标题】:Use application class as singleton将应用程序类用作单例
【发布时间】:2017-07-30 16:48:45
【问题描述】:

在 Android 中,我们经常不得不使用 Context 类。当一个类或方法需要 Context 时,我们经常使用 ActivitesServices 来表示此类参数。以下代码来自我找到的一个网站,但我不知道这是否是一种好习惯以及是否可以使用此解决方案:

public class MyApplication extends Application {
    private static MyApplication singleton;

    @Override
    public void onCreate() {
        super.onCreate();
        singleton = this;
    }

    public static MyApplication getInstance() {
        return singleton;
    }
}

首先,在这里使用单例模式对我来说看起来不错。我的意思是每次我的一些应用程序代码在 Android 中执行时,系统都会创建一个进程,因此也存在一个应用程序上下文,我可以在其他类中使用它。

另一方面,使用它是错误的。使用这种模式,每个类(还有我们应该避免 Context 对象的 pojo 和单例)都能够简单地获得对实际 Context 的有效引用(我认为)不是 Context 对象背后的想法。

那么您如何看待这个解决方案?可以使用它还是有一些原因(例如应用程序的生命周期等)来避免这种情况?还是我这里的一些假设是错误的?

【问题讨论】:

  • 这不是单例。为了有一个单例,你必须声明一个 private 构造函数。上面的代码所做的是将您的类的实例保存在static 属性中。
  • @CommonsWare 感谢您提供链接。我搜索了一下,但显然没有找到这个问题的正确关键字,抱歉。

标签: android android-context android-lifecycle


【解决方案1】:

是的,你是对的。可以以我们不需要此应用程序类实例的方式设计应用程序。

我在我的项目中使用依赖注入模式。比如说,我的 Presenter 类需要一个 DataRepository 类实例来获取数据。并且 DataRepository 类需要一个 Context 来访问 Database 或 SharedPreferences。

可以使用 Application 实例在我的 Presenter 类中创建 DataRepository 类。但是使用依赖注入模式,我在 Presenter 之外创建 DataRepository(可能是 Fragment/Activity),并通过其构造函数将 DataRepository 实例传递给 Presenter。

【讨论】:

    【解决方案2】:

    很好的@CommonsWare 的回答...只是补充...

    我认为这是一个糟糕的解决方案,因为它会导致 内存泄漏...即使发生这种情况非常非常困难...使用静态引用Context 实例非常糟糕,因为该 Application 实例在 ActivityManagerService 由于该静态引用而销毁它时不会被清理... -- 如下所述,它不会导致任何在这种情况下内存泄漏。

    我不喜欢这种解决方案...直接使用Context 比直接使用它(例如getApplicationContext())更安全。

    obs.: 它也违反了单例模式,因为它没有限制类的实例化,也不能确保它只能有一个实例......但它不是相关...

    【讨论】:

    • 应用类绑定到整个应用jvm的时候违反是什么意思!没有泄漏。答案是错误的。但当然使用 DI 是更好的解决方案
    • 这不会导致内存泄漏。应用程序已经是进程中的单例;您只是在创建对它的第二个引用。当Android系统需要回收资源时,它不会对应用程序进行垃圾回收;它只是杀死了进程本身。 Application 类没有onDestroy() 方法,因为ActivityManagerService 不会破坏应用程序对象(与应用程序组件对象不同)。 OP 发布的代码的真正问题在于,它鼓励在不合适的情况下使用应用程序上下文。
    • 是的,你说得对,我再次分析,发现不会导致内存泄漏,感谢您的 cmets。当我这么说的时候,我以为只存在一个包中的应用程序实例......而正确的方法是一个进程拥有一个应用程序......并且应用程序实例与其进程一起被杀死。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-04-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-20
    相关资源
    最近更新 更多