安卓應用編程:
因此,假設我在片段的 onResume() 塊中觸發了一個異步任務,該任務在完成時具有 2 個 Java 回呼方法 - onSuccess() 和 onFailure()。同時,螢屏上有一個按鈕,用戶可以隨時單擊。問題是,在單擊按鈕時,我需要在執行按鈕單擊代碼之前等待較早的異步任務完成。
我需要在異步任務完成時在按鈕單擊時顯示一個進度條(如果它尚未完成),但不知道如何對其進行編碼,以便在單擊按鈕時我知道按鈕已被單擊,并且異步任務尚未完成,我需要等待它完成才能繼續進行。
我想我需要在這個程序中使用 LiveData 和/或 Kotlin 協程,但不確定如何繼續。
任何人都可以請指導我正確的方向嗎?我正在盡力理解異步編程。
uj5u.com熱心網友回復:
如果您現在不使用協程等,那么您只需使用幾個布林值和 ifs 就可以輕松實作這一點。假設 all onSuccess(), onFailure()andonBtnClick()在主執行緒上呼叫,這應該可以解決問題:
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()
}
}
您還應該考慮其他極端情況,例如:第一個任務在它已經運行時被調度;在第二個任務運行時單擊按鈕,等等。
uj5u.com熱心網友回復:
lateinit var在您的Activity, 頂部定義 aprivate 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) {...}函式提供足夠的調度程式。
如果你使用 aFragment而不是ActivityuseviewLifecycleOwner.lifecycleScope.launch而不是lifecycleScope.launch
lifecycleScope 是一個擴展函式,可以在 androidx.lifecycle:lifecycle-runtime-ktx:version
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/345419.html
