#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. Ну, это не сработало, но ваше предложение привело к решению. Мне нужно было передать ссылку на контекст из моей вызывающей деятельности. Спасибо!