【问题标题】:Close long running task in CoroutineScope Android Kotlin在 CoroutineScope Android Kotlin 中关闭长时间运行的任务
【发布时间】: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


【解决方案1】:

您可以通过这种方式创建协程,然后将其关闭。

val job= CoroutineScope(Dispatchers.Default).launch { 
        //write your code here
    }
    //write your code here
    job.cancel()

【讨论】:

  • 您好,感谢您的评论我已经尝试使用 val coroutine = CoroutineScope(Dispatcher.IO) 然后 coroutine.cancel() 就像我上面的代码一样,但我试过你的代码是这样的:
猜你喜欢
  • 2014-09-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-07-08
  • 1970-01-01
  • 1970-01-01
  • 2012-08-13
相关资源
最近更新 更多