如何等待一个异步任务完成,在onResume()中开始,而用户被允许在此期间点击一个按钮,取决于它?



Android应用程序编程:

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

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

我想我需要在这个过程中使用LiveData和/或Kotlin协程,但不确定如何继续。

谁能给我指点一下正确的方向吗?我正在努力理解异步编程。

如果您现在不使用协程等,那么您可以使用几个布尔值和If轻松实现这一点。假设所有的onSuccess(),onFailure()onBtnClick()都在主线程上被调用,这应该可以达到目的:

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()
}
}

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

Activity,private lateinit var asyncJob: Job的顶部定义一个lateinit var

override fun onResume() {
super.onResume()
asyncJob = lifecycleScope.launch {
// Do the work
}
}
fun onButtonClicked() {
while (asyncJob.isActive) showProgressIndicator()
hideProgressIndicator()
// Handle the button click
}

请记住,lifecycleScope的默认线程是main,如果您想要在后台线程上运行协程,请为launch(dispatcher) {...}函数提供适当的分派器。

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

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

中找到。