使用应用程序 class 作为单例
Use application class as singleton
在Android中我们经常要用到Contextclasses。当 class 或方法需要 Context 时,我们经常使用 Activites 或 Services争论。以下代码来自我找到的一个网站,但我不知道这是否是好的做法,是否可以使用此解决方案:
public class MyApplication extends Application {
private static MyApplication singleton;
@Override
public void onCreate() {
super.onCreate();
singleton = this;
}
public static MyApplication getInstance() {
return singleton;
}
}
首先,我觉得在这里使用单例模式没问题。我的意思是每次我的一些应用程序代码在 Android 中执行时,系统都会创建一个进程,因此也存在一个应用程序上下文,我可以在其他 class 中使用它。
另一方面,用这个也是不对的。使用这种模式,每个 class(还有我们应该避免使用 Context 对象的 pojo 和单例)都能够简单地获得对实际 Context[ 的有效引用=27=] 这(我认为)不是 Context 对象背后的想法。
那么您如何看待这个解决方案?可以使用它还是有一些原因(例如应用程序的生命周期等)来避免这种情况?或者我这里的一些假设是错误的?
是的,你是对的。可以以我们不需要此应用程序 class 实例的方式设计应用程序。
我在我的项目中使用依赖注入模式。例如,我的 Presenter class 需要一个 DataRepository class 实例来获取数据。 DataRepository class 需要上下文来访问数据库或 SharedPreferences。
可以使用 Application 实例在我的 Presenter class 中创建 DataRepository class。但是使用依赖注入模式,我在 Presenter 之外创建了 DataRepository(可能是 Fragment/Activity)并通过其构造函数将 DataRepository 实例传递给 Presenter。
非常好的@CommonsWare 的回答...只是补充...
我认为这是一个糟糕的解决方案,因为它可能会导致 内存泄漏 ...尽管这很难发生...使用对 Context
实例的静态引用是非常糟糕的,因为当 ActivityManagerService 由于该静态引用而销毁它时,此 Application
实例将不会被清除... -- 如下所述,在这种情况下它不会导致任何内存泄漏。
我不喜欢这种解决方案...直接使用 Context
比它更安全(例如 getApplicationContext()
)。
obs.: It is also Violating Singleton Pattern because it is not restricting the instantiation of the class and doesn't ensure that there can be only one instance of it... but it is not relevant...
在Android中我们经常要用到Contextclasses。当 class 或方法需要 Context 时,我们经常使用 Activites 或 Services争论。以下代码来自我找到的一个网站,但我不知道这是否是好的做法,是否可以使用此解决方案:
public class MyApplication extends Application {
private static MyApplication singleton;
@Override
public void onCreate() {
super.onCreate();
singleton = this;
}
public static MyApplication getInstance() {
return singleton;
}
}
首先,我觉得在这里使用单例模式没问题。我的意思是每次我的一些应用程序代码在 Android 中执行时,系统都会创建一个进程,因此也存在一个应用程序上下文,我可以在其他 class 中使用它。
另一方面,用这个也是不对的。使用这种模式,每个 class(还有我们应该避免使用 Context 对象的 pojo 和单例)都能够简单地获得对实际 Context[ 的有效引用=27=] 这(我认为)不是 Context 对象背后的想法。
那么您如何看待这个解决方案?可以使用它还是有一些原因(例如应用程序的生命周期等)来避免这种情况?或者我这里的一些假设是错误的?
是的,你是对的。可以以我们不需要此应用程序 class 实例的方式设计应用程序。
我在我的项目中使用依赖注入模式。例如,我的 Presenter class 需要一个 DataRepository class 实例来获取数据。 DataRepository class 需要上下文来访问数据库或 SharedPreferences。
可以使用 Application 实例在我的 Presenter class 中创建 DataRepository class。但是使用依赖注入模式,我在 Presenter 之外创建了 DataRepository(可能是 Fragment/Activity)并通过其构造函数将 DataRepository 实例传递给 Presenter。
非常好的@CommonsWare 的回答...只是补充...
我认为这是一个糟糕的解决方案,因为它可能会导致 内存泄漏 ...尽管这很难发生...使用对 -- 如下所述,在这种情况下它不会导致任何内存泄漏。 Context
实例的静态引用是非常糟糕的,因为当 ActivityManagerService 由于该静态引用而销毁它时,此 Application
实例将不会被清除...
我不喜欢这种解决方案...直接使用 Context
比它更安全(例如 getApplicationContext()
)。
obs.: It is also Violating Singleton Pattern because it is not restricting the instantiation of the class and doesn't ensure that there can be only one instance of it... but it is not relevant...