簡體   English   中英

GlobalScope 用於在 Android 中保存文件

[英]GlobalScope for saving files in Android

我有需要將一些對象保存到磁盤的場景。 到目前為止,我一直在使用 Java 的 ExecutorService 來做這件事。 但是我現在正在將我的部分代碼重構為 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)
    }
}

現在我讀了這篇文章: https://medium.com/@elizarov/the-reason-to-avoid-globalscope-835337445abc

在這種特殊情況下,我仍然沒有理由避免使用 GlobalScope。 這些文件寫入是我在我的應用程序級別上需要的東西,它們不是在我發送這些調用后可以隨時取消的東西。

我想到的另一個選擇是讓 KotlinUtils class 實現 CoroutineScope 然后只調用launch而不是GlobalScope.launch 再想一想,這有點問題,因為 KotlinUtil 似乎必須是抽象的,但它不可能是抽象的(它是使用 dagger2 的@Singleton class)

但是,我對 Kotlin 和協程還很陌生,所以也許我誤解了一些東西。 任何建議將不勝感激。

GlobalScope 是一個 singleton,與任何作業無關。 這會啟動頂級協程並且非常不鼓勵使用,因為如果您在全局 scope 中啟動協程,您將失去從結構化並發中獲得的所有好處

因此,如果您知道這一點並且您的任務完全獨立於應用程序中的其他所有內容。 特此獨立,我的意思是,即使應用程序的其他部分出現問題,您也不希望取消當前正在運行的任務。 在這種情況下,我認為可以使用GlobalScope

例如,如果您在循環中調用saveFileInBackground任務,即使它在其中一次迭代中失敗,您也不想終止循環並希望繼續執行迭代的 rest。

使用GlobalScope時要記住的另一件事是,如果您在GlobalScope中錯誤地編寫了錯誤的代碼,它將保留在那里並且不會被應用程序的其他部分取消,這意味着您的應用程序將永遠不會終止

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM