Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/kotlin/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/video/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 如何为阻止下载操作取消kotlin协程_Android_Kotlin_Youtube_Youtube Dl - Fatal编程技术网

Android 如何为阻止下载操作取消kotlin协程

Android 如何为阻止下载操作取消kotlin协程,android,kotlin,youtube,youtube-dl,Android,Kotlin,Youtube,Youtube Dl,下面是我在Dispatcher.IO线程池上运行的一段代码 suspend fun download(rquest: YoutubleDLRequest){ withContext(Dispatchers.IO){ YoutubeDL.init().execute(request) // downloads media in background } } 现在,当用户单击一个按钮时,下载就开始了——要么由于网络错误而失败,要么完成。 我的问题是如

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

suspend fun download(rquest: YoutubleDLRequest){
      withContext(Dispatchers.IO){
         YoutubeDL.init().execute(request) // downloads media in background
      }
   }
现在,当用户单击一个按钮时,下载就开始了——要么由于网络错误而失败,要么完成。 我的问题是如何取消此下载操作? 我有另一个按钮,允许用户取消下载操作。 如果我在发布中使用上下文包装并保留对作业的引用,然后尝试 单击按钮取消作业,它将不工作。我知道,我需要另一个暂停点,我尝试在while循环中调用另一个具有yield的暂停函数。但是,while循环根本不允许下载代码执行。
我不明白,在这种情况下如何实现取消。如果有任何帮助,我们将不胜感激。

这个答案是在原始海报改变他的问题之前写的,因此不再是重点。对不起


根据你的用例:你可以考虑多个选项:

假设您的YoutubeDownloader在被取消时抛出一个
DownloadeException

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){/*您的代码在这里*/}


withContext()不返回作业实例,但是,如果在启动生成器中包装withContext调用,则可以获得作业,但取消此类操作很复杂,因为youtube dl是python库的包装器,正在执行的代码不是java代码。我尝试过文档中描述的取消解决方案,但是,它们似乎无法解决我的问题。很抱歉,我还没有喝咖啡。。我更新了我的代码。>我尝试了文档中描述的取消解决方案,但是,它们似乎无法解决我的问题。-->您是否查看了python库文档或协同程序文档?我想你必须编写gluecode,比如if(coroutineCanceled)然后(在python库上调用cancel)我发现,我的android进程在下载媒体时启动了一个python进程。对于取消,我在单击cancel按钮时查询python进程的pid,然后pid被传递到android的process.killprocess静态方法,它将终止python进程,从而停止下载。我认为问题已经解决了,如果不终止应用程序进程本身,就不可能停止从普通java/kotlin代码下载操作。因此,这不是一个协同程序问题。
val myDownloadJob = someScope.launch(someDispatcher){ /* your code here */ } 

// somewhere else:
myDownloadJob.cancel()