【发布时间】:2023-01-12 21:00:07
【问题描述】:
我的应用程序中有过时的更新系统,它已过时,因为使用了 AsyncTask。在 ViewModel 中调用任务,然后开始下载 apk 文件。当应用程序下载文件功能发送到界面时,下载了多少文件。当我返回设置并再次更新活动时,界面仍然记得之前的 % 并且仍然从之前的任务下载。 这就是我执行任务的方式。
fun startUpdate( listener: ApplicationUpdaterResponder) {
coroutine.launch {
try {
updater.tryUpdate(listener, AppVariant.Companion)
} catch (e: Exception) {
setMessage(e.message.toString())
Log.i(TAG, e.printStackTrace().toString())
}
}
}
我试图通过关闭协程来停止此任务,但它不起作用
fun stopJob() {
updater.stopUpdate()
coroutine.cancel("Przerwano")
}
tryUpdate 是这样看的
class DownloadAPK(val context: Context): AsyncTask<String, String, String>() {
override fun doInBackground(vararg params: String?): String {
//here fille download and update listener(interface)
//listener.setPercent((progress*100)/total)
}
结果必须是这样的:就像用户从更新活动中退出一样,任务停止,如果用户再次去更新它应该从零开始一切。
现在它仍然记得以前的任务,并且两个值被发送到新旧接口。
我尝试使用 CoroutineScope 执行任务并尝试取消功能但它不起作用。 我还尝试将 DownloadAPK(val context: Context) 定义为变量,然后在变量上使用 .cancel(true) 但它仍然不起作用
编辑// 我尝试了 zahid 命题,但这仍然不起作用
private var job : Job? = null
fun startUpdate(context: Context, listener: ApplicationUpdaterResponder) {
job = viewModelScope.launch(IO) {
try {
val updater = ApplicationUpdater(context)
updater.tryUpdate(listener, AppVariant.Companion.TransportFP4)
} catch (e: Exception) {
FirebaseCrashlytics.getInstance().recordException(e)
setMessage(e.message.toString())
}
}
}
fun stopJob() {
job!!.cancel()
}
【问题讨论】:
-
如果您从 ViewModel 调用,您可以尝试使用
viewModelScope.launch吗? -
@akubi 感谢您的评论,我已经尝试过这个解决方案,但仍然没有用
标签: android kotlin kotlin-coroutines