首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何等待在onResume()中启动的异步任务完成,同时允许用户单击依赖于它的按钮?

如何等待在onResume()中启动的异步任务完成,同时允许用户单击依赖于它的按钮?
EN

Stack Overflow用户
提问于 2021-10-23 10:28:19
回答 2查看 604关注 0票数 0

安卓应用程序编程:

因此,假设我在我的片段的onResume()块中触发了一个异步任务,该块在完成时有两个Java回调方法-- onSuccess()和onFailure()。同时,屏幕上有一个按钮,用户可以随时点击。问题是,在单击按钮时,我需要等待更早的异步任务完成,然后再执行按钮单击代码。

在异步任务完成时,我需要在按钮单击上显示一个进度条(如果异步任务尚未完成),但不确定如何对其进行编码,因此在单击按钮时,我知道按钮已被单击,而且异步任务还没有完成,我需要等待它完成,然后再继续。

我认为在这个过程中我需要使用LiveData和/或Kotlin协同器,但不确定如何进行。

有人能引导我朝正确的方向前进吗?我正在尽我最大的努力来理解异步编程。

EN

回答 2

Stack Overflow用户

发布于 2021-10-23 19:04:20

如果您现在不使用coroutines等,那么只需使用几个布尔值和ifs就可以很容易地实现这一点。假设在主线程上调用了所有的onSuccess()onFailure()onBtnClick(),那么这应该可以做到:

代码语言:javascript
复制
private var firstTaskRunning = false
private var scheduledSecondTask = false

fun startFirstTask() {
    firstTaskRunning = true
    // start first task
}

fun onSuccess() {
    onFirstTaskFinished()
}

fun onFailure() {
    onFirstTaskFinished()
}

fun onFirstTaskFinished() {
    firstTaskRunning = false
    
    if (scheduledSecondTask) {
        scheduledSecondTask = false
        hideBtnProgress()
        secondTask()
    }
}

fun onBtnClick() {
    if (firstTaskRunning) {
        scheduledSecondTask = true
        showBtnProgress()
    } else {
        secondTask()
    }
}

您还应该考虑其他角的情况,例如:第一个任务已经在运行时被调度;当第二个任务正在运行时单击按钮,等等。

票数 1
EN

Stack Overflow用户

发布于 2021-10-23 18:30:31

lateinit var的顶部定义一个Activityprivate lateinit var asyncJob: Job

代码语言:javascript
复制
override fun onResume() {
    super.onResume()
    asyncJob = lifecycleScope.launch {
        // Do the work
    }
}

fun onButtonClicked() {
    while (asyncJob.isActive) showProgressIndicator()
    hideProgressIndicator()
    // Handle the button click
}

请记住,lifecycleScope的默认线程是主线程,如果您希望在后台线程上运行协同器,则为launch(dispatcher) {...}函数提供适当的调度器。

如果您使用的是Fragment而不是Activity,请使用viewLifecycleOwner.lifecycleScope.launch而不是lifecycleScope.launch

lifecycleScope是一个扩展函数,可以在androidx.lifecycle:lifecycle-runtime-ktx:version中找到。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/69687242

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档