安卓应用程序编程:
因此,假设我在我的片段的onResume()块中触发了一个异步任务,该块在完成时有两个Java回调方法-- onSuccess()和onFailure()。同时,屏幕上有一个按钮,用户可以随时点击。问题是,在单击按钮时,我需要等待更早的异步任务完成,然后再执行按钮单击代码。
在异步任务完成时,我需要在按钮单击上显示一个进度条(如果异步任务尚未完成),但不确定如何对其进行编码,因此在单击按钮时,我知道按钮已被单击,而且异步任务还没有完成,我需要等待它完成,然后再继续。
我认为在这个过程中我需要使用LiveData和/或Kotlin协同器,但不确定如何进行。
有人能引导我朝正确的方向前进吗?我正在尽我最大的努力来理解异步编程。
发布于 2021-10-23 19:04:20
如果您现在不使用coroutines等,那么只需使用几个布尔值和ifs就可以很容易地实现这一点。假设在主线程上调用了所有的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()
}
}您还应该考虑其他角的情况,例如:第一个任务已经在运行时被调度;当第二个任务正在运行时单击按钮,等等。
发布于 2021-10-23 18:30:31
在lateinit var的顶部定义一个Activity,private lateinit var asyncJob: Job
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中找到。
https://stackoverflow.com/questions/69687242
复制相似问题