Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/kotlin/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
用于在Android中保存文件的GlobalScope_Android_Kotlin_Coroutine_Kotlin Coroutines - Fatal编程技术网

用于在Android中保存文件的GlobalScope

用于在Android中保存文件的GlobalScope,android,kotlin,coroutine,kotlin-coroutines,Android,Kotlin,Coroutine,Kotlin Coroutines,我有需要将一些对象保存到磁盘的场景。到目前为止,我一直在使用Java的Executor服务来完成这项工作。但我现在正在将我的部分代码重构到Kotlin,我想知道我是否处理得对 因此,在Java中,我有一个代码用于我的Kotlin函数,它是: // Java code calls this function in KotlinUtils.kt: fun saveFileInBackground(saveObj: Any, fileName: String) { GlobalScope.la

我有需要将一些对象保存到磁盘的场景。到目前为止,我一直在使用Java的Executor服务来完成这项工作。但我现在正在将我的部分代码重构到Kotlin,我想知道我是否处理得对

因此,在Java中,我有一个代码用于我的Kotlin函数,它是:

// Java code calls this function in KotlinUtils.kt:
fun saveFileInBackground(saveObj: Any, fileName: String) {
    GlobalScope.launch {
        saveFile(...)
    }
}

private suspend fun saveFile(data: ByteArray, ...) {
    withContext(Dispatchers.IO) {
        var file = File(....)
        if (!file.exists()) file.mkdirs()

        file.writeBytes(data)
    }
}
现在我读了这篇文章:

在这种特殊情况下,我仍然不认为有理由避免使用GlobalScope。这些文件写入是我在我的应用程序级别上需要的,并且在我发送这些呼叫后,它们不是可以随时取消的

我想到的另一个选项是让KotlinUtils类实现CoroutineScope,然后只调用launch而不是GlobalScope.launch。 再想一想,这有点问题,因为KotlinUtil似乎必须是抽象的,而不是抽象的(它是一个使用dagger2的@Singleton类)

然而,我对Kotlin和Coroutines还比较陌生,所以我可能误解了什么。
任何建议都将不胜感激。

GlobalScope是单身人士,与任何工作都无关。这将启动顶级协同路由,但不鼓励使用,因为如果您在全局范围内启动协同路由,您将失去从中获得的所有好处

因此,如果您知道这一点,并且您的任务完全独立于应用程序中的所有其他内容。因此,我的意思是,即使应用程序的其他部分出现问题,您也不希望取消当前正在运行的任务。在这种情况下,我认为使用
GlobalScope

例如,如果在循环中调用
saveFileInBackground
task,即使它在其中一个迭代中失败,也不希望终止循环,而希望继续其余的迭代


在使用
GlobalScope
时,如果您在
GlobalScope
中错误地编写了错误的代码,请记住另一件事,它将留在那里,不会被应用程序的其他部分取消,这意味着您的应用程序将永远不会终止

那么您的问题是什么?我使用GlobalScope的解决方案是否存在任何问题,或者我是否应该选择我提到的第二个选项,或者是完全不同的东西?关于
GlobalScope
是否适合在Android应用程序中执行协同程序(即使用户导航远离某个活动/片段(从而清除任何viewmodel及其
viewModelScope
),仍存在一些争论。短期内,使用GlobalScope,但要注意谷歌认可的替代方案。与我的上述声明相反,你很难最终使用GlobalScope。您可以拥有自己的顶级作用域,并使用它启动顶级协同路由。在应用程序终止代码中,您可以销毁该作用域,以确保不会泄漏任何协同路由谢谢。那么,对于这个具体案例,我将如何着手拥有自己的范围呢?匕首2不知怎的会成为一个问题吗?(有自己的范围)。我是否应该为KotlinUtils.kt类创建一个作用域?