首页 > 解决方案 > 如何取消阻止下载操作的 kotlin 协程

问题描述

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

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

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

标签: androidkotlinyoutubeyoutube-dl

解决方案


这个答案是在原始发帖人改变他的问题之前写的,因此不再重要。对不起。


您可以考虑多种选择,具体取决于您的用例:

假设您的 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()

推荐阅读