如何取消阻止下载操作的kotlin协同程序



这是我在Dispatcher.IO线程池上运行的一段代码

suspend fun download(rquest: YoutubleDLRequest){
withContext(Dispatchers.IO){
YoutubeDL.init().execute(request) // downloads media in background
}
}

现在,当用户单击一个按钮时,下载就会开始——它要么由于网络错误而失败,要么完成。我的问题是如何取消此下载操作?我有另一个按钮,允许用户取消下载操作。如果我在启动中使用Context包装并保留对作业的引用,然后尝试单击按钮取消作业,它将不起作用。我知道,我需要另一个挂接点,我试着在while循环中调用另一个具有yield的挂起函数。但是,while循环根本不允许下载代码执行。我不明白,在这种情况下取消将如何实现。如有任何帮助,我们将不胜感激。

这个答案是在原发帖人改变问题之前写的,因此不再切中要害。很抱歉


根据您的用例,您可以考虑多种选项:

假设YoutubeDownloader在取消时抛出DownloadException

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")   
}
}
}

如果你想主动取消协同程序,你可以把它保存为一个变量,就像在基本文档中一样,在取消文档中有更多的例子:

val myDownloadJob=withContext(Dispatchers.IO({/*您的代码在此处*/}

val myDownloadJob = someScope.launch(someDispatcher){ /* your code here */ } 
// somewhere else:
myDownloadJob.cancel()

相关内容

最新更新