Лучше всего использовать lateinit?

Существует обработка для получения изображения, удерживаемого андроидом, с помощью курсора. Курсор нуждается в авторизации для внешнего хранилища. Если AndroidOS 6.0 или выше, а разрешение авторизации не будет получено, приложение будет прекращено. Если получено разрешение, необходима обработка для закрытия курсора.

Если это Java, было бы неплохо написать onStop следующим образом, за исключением Kotlin, будет создано исключение.

if (cursor != null ) cursor.close(); kotlin.UninitializedPropertyAccessException: lateinit property cursor has not been initialized 

Поэтому я написал, что мы инициализируем курсор и завершаем его.

 cursor = contentResolver.query( MediaStore.Images.Media.INTERNAL_CONTENT_URI, null, null, null, null ) 

Это больше не вызывает исключения, но кажется, что вы пишете ненужный код, и он становится неясным. Тем не менее, я не задерживаю курсор, и я думаю, что это бесполезный код для его инициализации во время объявления. Кроме того, при объявлении private var cursor: Cursor? = Null private var cursor: Cursor? = Null , я думаю, что нулевой код суждения необходим в разных местах, и я не думаю, что это похоже на Котлин.

Я был бы рад, если бы вы могли дать мне советы о том, как написать лучшее.

Это код, который используется:

 private lateinit var cursor : Cursor private val PERMISSIONS_REQUEST_CODE = 100 override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_main) if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { // Android Version 6.0 later if(checkSelfPermission(Manifest.permission.READ_EXTERNAL_STORAGE) == PackageManager.PERMISSION_GRANTED) { initCursor() } else { requestPermissions(arrayOf(Manifest.permission.READ_EXTERNAL_STORAGE), PERMISSIONS_REQUEST_CODE) } } else { // Android Version under 6.0 initCursor() } } override fun onRequestPermissionsResult(requestCode: Int, permissions: Array<out String>, grantResults: IntArray) { when (requestCode) { PERMISSIONS_REQUEST_CODE -> if (grantResults[0] == PackageManager.PERMISSION_GRANTED) { initCursor() } else { finishApp() } else -> finishApp() } } private fun finishApp() { // It prevents kotlin.UninitializedPropertyAccessException of cursor(lateinit valiant). It's last resort... cursor = contentResolver.query( MediaStore.Images.Media.INTERNAL_CONTENT_URI, null, null, null, null) /* if(cursor != null) cursor.close() */ finish() } override fun onStop() { super.onStop() cursor.close() } private fun initCursor() { cursor = contentResolver.query( MediaStore.Images.Media.EXTERNAL_CONTENT_URI, null, null, null, null) cursor.moveToFirst() } 

Нет, это не лучшее использование lateinit . Во-первых, использование lateinit – это переменная, которая должна быть доступна, когда она используется. Используя значение lateinit переменная может быть нулевой, которая различна для lateinit означает, что она не должна быть нулевой.

Это довольно полезно в Android, поскольку вы onCreate переменную в onCreate вместо конструктора. Это также хорошо подходит для инъекций лисица кинжала.

Он выбрасывает UninitializedPropertyAccessException означает, что ваш Cursor не инициализируется, когда он получает доступ. Это означает, что в вашем коде есть логическая ошибка, при которой курсор получает доступ без инициализации.

Обратите внимание: удерживание Cursor не является хорошей практикой. Он поддерживает соединение с базой данных. Вы должны закрыть его после использования и воссоздать новый, а не удерживать его.