Android 如何为阻止下载操作取消kotlin协程
下面是我在Dispatcher.IO线程池上运行的一段代码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 } } 现在,当用户单击一个按钮时,下载就开始了——要么由于网络错误而失败,要么完成。 我的问题是如
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()