【问题标题】:Kotlin singleton with object issue带有对象问题的 Kotlin 单例
【发布时间】:2021-09-22 15:50:35
【问题描述】:

我正在尝试用 Kotlin 做单例模式,但我不明白为什么我在这里得到空指针异常

object AppController : Application() {
    private val queue: RequestQueue = Volley.newRequestQueue(applicationContext)

   fun getRequestQueue(): RequestQueue {
        return queue
    }
}

在我打电话的主要活动中:

private val controller  = AppController
private val queue = AppController.getRequestQueue()

感谢您的帮助。对不起。我不确定为什么代码格式不正确。

【问题讨论】:

  • 您添加的代码sn-ps不可见,我只能看到“...”,您可以更新您的帖子并确保代码在预览中可见吗?

标签: android kotlin singleton


【解决方案1】:

简单地把对象改成类,可能android初始化有问题

class AppController : Application() {
    private val queue: RequestQueue = Volley.newRequestQueue(applicationContext)

   fun getRequestQueue(): RequestQueue {
        return queue
    }
}

干杯

【讨论】:

  • 感谢您的建议,但我想限制这种情况,所以课程不适合我。
  • @JoeBones 应用的实例是系统自动创建的,如果你引用AndroidManifest中的类,这个不能是Object,官方文档中提到了app类的使用方法。请看-developer.android.com/guide/topics/manifest/…
【解决方案2】:

您没有指定哪一行代码引发了异常,所以我假设是这个:

private val queue: RequestQueue = Volley.newRequestQueue(applicationContext)

虽然我在documentation 中看不到这一点,但我不希望applicationContext 在您的ApplicationonCreate 被调用之前可用,并且以这种方式声明该属性您在构造函数调用期间调用applicationContext,在onCreate 之前。我建议实施以下更改:

object AppController : Application() {
    private lateinit var queue: RequestQueue

    override fun onCreate() {
        super.onCreate()
        queue = Volley.newRequestQueue(applicationContext)
    }


   fun getRequestQueue(): RequestQueue {
        return queue
    }
}

这应该确保applicationContext 在您访问它时被初始化。

【讨论】:

  • 好吧,这不起作用,但您的建议导致了解决方案。我需要从我的调用活动中传递上下文的引用。谢谢!
猜你喜欢
  • 2017-05-29
  • 2019-10-10
  • 2016-10-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多