首页 > 解决方案 > 通过 Kotlin 协程在后台保存文件

问题描述

在 ViewModel 中的我的 android 应用程序中

 private fun finishProcessRecognizedCheck(
        firebaseVisionImage: FirebaseVisionImage,
        firebaseVisionText: FirebaseVisionText, recognizedCheck: Check
    ) {
        val file_prefix = resultRecognizedCheckList.size.toString()
        RecognizedCheckDataService.saveRecognizedImage(firebaseVisionImage, file_prefix)
        RecognizedCheckDataService.saveRecognizedText(firebaseVisionText, file_prefix)
       }

如您所见,我将图像文件保存到UI 线程的内部文件夹中。结果应用程序被冻结。是否可以通过 Kotlin 的协程将图像保存在背景上?AA

标签: androidkotlin-coroutines

解决方案


协程需要在其上运行的范围。因此,我们使用调度程序和作业创建范围。

  1. 使用您创建的作业和调度程序定义作业并创建范围,如下所示:

    //Initialization of job
    private var job = Job()
    
    // Initialization of scope for the coroutine to run in
    private var scopeForSaving = CoroutineScope(job + Dispatchers.Main)
    
  2. 现在我们在单击按钮时触发保存操作,如下所示:

    private fun saveButtonClick() {
            scopeForSaving.launch { saveToStorage() }
    }
    private suspend fun saveToStorage(){
            withContext(Dispatchers.IO){
                  //Logic for saving the image goes here
            }
    }
    
  3. 我们可以取消其中的作业,onDestroy()以便在销毁活动时,可以确定所有协程都已终止。

    override fun onDestroy() {
        super.onDestroy()
        scopeForSaving.cancel()
    }
    

推荐阅读