【问题标题】:How i can use context in Singleton?我如何在单例中使用上下文?
【发布时间】:2020-02-20 10:18:34
【问题描述】:

我需要在我的 Singleton -> 上下文中。我知道我不能在构造函数中传递参数,因为对象没有构造函数。

然后我从我的应用程序类中调用它。

代码如下:

object Singleton {

    var userAgentInfo: String = UserAgentTools.buildUserAgent(context)

    fun initializeSdk() {
        AuthenticatorApiManager.initializeSdk(userAgentInfo)
    }
}

【问题讨论】:

  • SO上有几个类似的问题,你试过了吗?
  • 点赞this

标签: android object kotlin


【解决方案1】:

将 userAgentInfo 的初始化移动到 initializeSDK 方法中,并将 Context 作为参数发送,一定要发送 ApplicationContext。

object Singleton {

    var userAgentInfo: String? = null

    fun initializeSdk(context: Context) {
        userAgentInfo = UserAgentTools.buildUserAgent(context)
        AuthenticatorApiManager.initializeSdk(userAgentInfo)
    }
}

【讨论】:

  • 它会导致内存泄漏。见 [stackoverflow.com/questions/56102382/…
  • 如果上下文是一个activity或者类似的东西会导致内存泄漏,但是应用上下文在应用的整个生命周期中都已经在内存中了,应用的时候singletone会被销毁与应用程序上下文一起销毁
  • 是的。如果您传递应用程序上下文,则不会有任何问题。
  • 在这个函数中使用context.applicationContext是安全的。那么你就不用担心传入什么样的上下文了。
【解决方案2】:

制作应用程序类并编写以下代码。

companion object {
    private lateinit var sInstance: ApplicationClass
    fun getInstance(): ApplicationClass {
        return sInstance
    }
}

在如下对象中使用。

ApplicationClass.getInstance()

【讨论】:

    【解决方案3】:

    您可以使用 Application 类实例在 Singleton 类中使用上下文。here it is

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-07-03
      • 2015-11-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多