微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

我想在使用 kotlin 协程的 android 上超时后取消一个函数,但它不起作用

如何解决我想在使用 kotlin 协程的 android 上超时后取消一个函数,但它不起作用

我想做的是用谷歌云翻译翻译文本列表,这是可行的,但有时很慢。因此,在 10 秒后,我想取消它并使用 withTimeoutOrNull 块,但它不会取消它即使在超时后仍继续运行的操作。

  lifecycleScope.launch {
                withContext(dispatchers.IO) {   
     var imageClassesListInHungarian = listof<String>()
                        withTimeoutOrNull(10000) {
                            imageClassesListInHungarian = translateList(
                                imageClassesList,"hu",resources
                            )
                        }  // cannot be cancelled but I don't kNow why
            
                  ...
             } 
    }



fun translateList(originalTextsList: List<String>,targetLanguage: String,resources: Resources): List<String> {
        val translatedTextsList = mutablelistof<String>()
        try {
            val translate = getTranslateService(resources)
            val translation = translate?.translate(originalTextsList,Translate.TranslateOption.targetLanguage(targetLanguage),Translate.TranslateOption.model("base"))
            if (translation != null) {
                for(t in translation) {
                    translatedTextsList.add(t.translatedText)
                }
            }
        }
        catch (e: TranslateException) {
            e.printstacktrace()
        }
        return translatedTextsList
    }

解决方法

看看withTimeoutOrNull documentation

在具有指定超时的协程中运行给定的暂停代码块,如果超过此超时则返回 null

这意味着您的 translateList 函数需要暂停函数。

这里有一个很好的 tutorial 解释了如何将回调函数转换为挂起函数。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。