当前位置: 首页 > 知识库问答 >
问题:

使用lateinit是最好的方法吗?

羊舌迪
2023-03-14

使用cursors来获取android所保存的图像,需要对cursors进行外部存储授权。如果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 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()
}

共有1个答案

濮阳鸿祯
2023-03-14

不,这不是lateInit的最佳用法。首先,lateInit的使用是为了一个在使用时应该可用的变量。使用nullable mean,变量可以为null,这与lateInit不同,这意味着它不应该为null。

在Android中,它作为oncreate而不是构造函数中的初始变量非常有用。它对依赖注入也很好,就像匕首一样。

它抛出uninitializedPropertyAccessException表示您的游标在访问时没有初始化。这意味着您的代码中存在一个逻辑错误,即光标在没有初始化的情况下被访问。

注意,保持游标不是一个好的做法。它保存到数据库的连接。您应该在使用它后关闭,并重新创建一个新的,而不是持有它。

 类似资料:
  • 问题内容: 首先,我必须说我对API java.util.concurrent很陌生,所以也许我正在做的事情是完全错误的。 我想怎么办? 我有一个Java应用程序,它基本上运行2个单独的处理(称为 myFirstProcess , mySecondProcess ),但是这些处理必须同时运行。 因此,我尝试这样做: myFirstProcess 和 mySecondProcess 是实现的类,它们

  • 我和JNI有一个Android项目。在实现侦听器类的CPP文件中,有一个回调x()。调用x()函数时,我想调用java类中的另一个函数。然而,为了调用该java函数,我需要访问JNIEnv*。 我知道在回调的同一个cpp文件中,有一个函数: 当

  • 本文向大家介绍VScode格式化ESlint方法(最全最好用方法),包括了VScode格式化ESlint方法(最全最好用方法)的使用技巧和注意事项,需要的朋友参考一下 ESlint:是用来统一JavaScript代码风格的工具,不包含css、html等。 背景: 近来研究前端,然后一直在百度上找VScode格式化(ESlint)的插件,结果找了半天都不靠谱。目前没有一个可以格式化html、css、

  • 我需要根据一些配置数据启动多个独立的周期性任务——总数事先不知道。例如,我想检查具有不同间隔和不同参数的不同目录的内容,其中列表和参数是从配置中读取的。 在我看来,夸克斯调度器只能调度固定的、预先已知的方法。动态/编程调度的最佳方法是什么?<代码>vertx.set周期 是正确的方法还是我应该以某种方式访问Quartz?

  • rank ▲ ✰ vote url 15 789 144 1269 url 检查列表是否为空的最好方法 例如,传递下面: a = [] 我怎么检查a是空值? if not a: print "List is empty" 用隐藏的空列表的布尔值才是最Pythonic的方法.

  • 问题内容: 我对某些外部jar具有运行时依赖性,因此我希望将这些外部jar重新“打包”成单个jar。这些外部依赖项存储在external_jars目录中,我希望不必将它们全部列出(即,如果我的依赖项发生更改,则无需更改构建脚本)。有什么想法吗? 粗略地讲,我需要遵循以下内容,它将lib目录中的所有jar组合到out.jar中(带有一些合理的覆盖规则)。 问题答案: 只需与Ant Zip任务一起使用