android - 如何取消阻止下载操作的 kotlin 协程
问题描述
这是我在 Dispatcher.IO 线程池上运行的一段代码
suspend fun download(rquest: YoutubleDLRequest){
withContext(Dispatchers.IO){
YoutubeDL.init().execute(request) // downloads media in background
}
}
现在,当用户单击按钮时,下载开始 - 由于网络错误而失败,或者完成。我的问题是如何取消此下载操作?我有另一个按钮允许用户取消下载操作。如果我在启动中包装 withContext 并保留对作业的引用,然后尝试在单击按钮时取消作业,它将不起作用。我知道,我需要另一个挂起点,我尝试在 while 循环中调用另一个挂起函数。但是,while 循环根本不让下载代码执行。我不明白,在这种情况下如何实现取消。任何帮助,将不胜感激。
解决方案
这个答案是在原始发帖人改变他的问题之前写的,因此不再重要。对不起。
您可以考虑多种选择,具体取决于您的用例:
假设您的 YoutubeDownloaderDownloadException
在取消时抛出一个:
suspend fun download(rquest: YoutubleDLRequest){
withContext(Dispatchers.IO){
try{
YoutubeDL.init().execute(request) // downloads media in background
Log.d("myTag", "Success"
} catch ( e: DownloadException){
Log.e("myTag", "Download-Failure: $e")
}
}
}
如果您想主动取消协程,可以将其保存为变量,如basic-docs中的此处,取消文档中有更多示例:
val myDownloadJob = withContext(Dispatchers.IO){ /* 你的代码在这里 */}
val myDownloadJob = someScope.launch(someDispatcher){ /* your code here */ }
// somewhere else:
myDownloadJob.cancel()
推荐阅读
- java - 使用 JNI 授予对 Android 应用程序的 C/C++ 本机端的 root 访问权限,这似乎是不可能的
- c++ - 将 cv::Mat 转换为 std::vector 的通用函数
- c# - 使用 DbConnection、SqlConnection、SqlCommand、DbCommand 等连接数据库
- python - Python函数将所有直方图绘制到同一个图中,而不是为每次迭代创建不同的图
- python - 如何强制将python输出保存为excel文件?
- angular - 用 Hammerjs 从每个点捏
- python - Python忽略缺失值
- javascript - 将基本轮询变成长轮询
- mysql - 如何使用 sql group by 选择前 2 项并对一个字段求和?
- python - 无法使用 python pyodbc 查询批量插入数据