Котлин синглтон с проблемой объекта

#android #kotlin #singleton

Вопрос:

Я пытаюсь выполнить одноэлементный шаблон с помощью 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()
 

Я ценю вашу помощь. Извините. Я не уверен, почему код неправильно форматируется.

Комментарии:

1. Фрагменты кода , которые вы добавили, не видны, я вижу на них только»…», можете ли вы обновить свой пост и убедиться, что код виден в предварительном просмотре?

Ответ №1:

Просто измените объект на класс, возможно, у Android возникли проблемы с его инициализацией

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

   fun getRequestQueue(): RequestQueue {
        return queue
    }
}
 

Овации

Комментарии:

1. Спасибо за предложение, но я хочу ограничить экземпляры этого, поэтому класс не работает для меня.

2. @JoeBones Экземпляр приложения автоматически создается системой, если вы ссылаетесь на класс в AndroidManifest, это не может быть объектом, в официальном документе упоминается, как используется класс приложения. Пожалуйста, посмотрите — developer.android.com/guide/topics/manifest/…

Ответ №2:

Вы не указали, какая строка кода вызывает исключение, поэтому я бы предположил, что это именно эта строка:

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

Хотя я не вижу, чтобы это упоминалось в документации, я бы не ожидал applicationContext , что оно будет доступно до того, как будет вызвано ваше Application «s onCreate «, и, объявив свойство таким образом, что вы вызываете 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 , что оно инициализируется в момент вашего доступа к нему.

Комментарии:

1. Ну, это не сработало, но ваше предложение привело к решению. Мне нужно было передать ссылку на контекст из моей вызывающей деятельности. Спасибо!