Android 通过Kotlin协同程序在后台保存文件

Android 通过Kotlin协同程序在后台保存文件,android,kotlin-coroutines,Android,Kotlin Coroutines,在我的android应用程序的ViewModel中 private fun finishProcessRecognizedCheck( firebaseVisionImage: FirebaseVisionImage, firebaseVisionText: FirebaseVisionText, recognizedCheck: Check ) { val file_prefix = resultRecognizedCheckList.

在我的android应用程序的ViewModel中

 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

协同程序需要一个作用域来运行。因此,我们使用调度器和作业创建一个作用域

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

    //Initialization of job
    private var job = Job()
    
    // Initialization of scope for the coroutine to run in
    private var scopeForSaving = CoroutineScope(job + Dispatchers.Main)
    
    private fun saveButtonClick() {
            scopeForSaving.launch { saveToStorage() }
    }
    private suspend fun saveToStorage(){
            withContext(Dispatchers.IO){
                  //Logic for saving the image goes here
            }
    }
    
  • 现在,单击按钮即可启动保存操作,如下所示:

    //Initialization of job
    private var job = Job()
    
    // Initialization of scope for the coroutine to run in
    private var scopeForSaving = CoroutineScope(job + Dispatchers.Main)
    
    private fun saveButtonClick() {
            scopeForSaving.launch { saveToStorage() }
    }
    private suspend fun saveToStorage(){
            withContext(Dispatchers.IO){
                  //Logic for saving the image goes here
            }
    }
    
  • 我们可以在
    onDestroy()
    中取消作业,这样当活动被销毁时,我们就可以确保所有协同路由都被终止

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