android - 通过 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
解决方案
协程需要在其上运行的范围。因此,我们使用调度程序和作业创建范围。
使用您创建的作业和调度程序定义作业并创建范围,如下所示:
//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() }
推荐阅读
- python - ffmpeg_python 库使用 ffmpeg 将自定义缩略图添加到 .mp4 文件?
- cpu - 只提高一核 CPU 速度
- r - 加快大型矩阵的创建和填充
- android - Android-解析数据库编辑其他用户信息
- python - 动态更改类变量的最佳方法
- angular - 在 2 个服务之间共享数据
- asp.net-core - httpcontext.user.claims 如何在分配的 asp.net 核心中获得它的值,它是否依赖于会话?
- reactjs - (React Native)在从 firebase 获取音频文件时更新“React-native-slider”的“fileduration”状态
- r - 如何使 nVennR 图表更具可读性(rstudio)?
- sql - Hive SQL 中的横向视图爆炸并将 INT 归因于一条记录