如何在 kotlin 中等待完成任务

问题描述 投票:0回答:3

我有这样的功能

internal fun handleResponse(items: List<TestItem>? = null) {
    viewModelScope.launch(Dispatchers.IO) {
        val isDataReturned = testItems != null
        if (isDataReturned) {
            dataModelList = getfilterDataList(items).toMutableStateList()
        }
        requestCompleteLiveData.postValue(isDataReturned)
    }
}

我通过 api 调用接收数据,因此它可能为 null 或为空。收到数据后,我传入函数

handleResponse
来过滤数据。
getfilterDataList()
方法是非常繁重的过滤处理,因为它有大量数据,即来自服务器的超过1000个项目和子项目。

所以我正在考虑改进代码

  • 如果

    isDataReturned
    返回
    false
    那么我将发送实时数据。

  • 如果

    isDataReturned
    返回
    true
    那么我必须等到
    dataModelList
    收集所有价值。

    var dataModelList = mutableStateListOf<DataModel>()
    

那么实现这一目标的最佳方法是什么?

我可以分享我的

getfilterDataList
方法,但不完整。

fun getfilterDataList(unfilteredList: List<TestItem>): MutableList<DataModel> {
        return unfilteredList
            .asSequence()
            .mapNotNull { it.testData }
            .filterNot { isInvalidTestData(it) }
            .mapIndexed { index, testData ->
                // more code in here
              DataModel()
            }.toMutableList()
}
android kotlin kotlin-coroutines android-jetpack
3个回答
1
投票

你可以编写挂起函数,它很简单:

suspend fun handleResponse(items: List<String>? = null): List<String> {
    if (items.isNullOrEmpty()) {
        return listOf()
    }

    return withContext(Dispatchers.IO) {
        items.map { it + " MODIFIED" }
    }
}

现在您可以从协程或其他挂起函数调用此函数来获取句柄响应。


0
投票

通过在Kotlin协程中使用runBlocking和await,您可以有效地暂停执行并等待特定任务或协程完成执行。


0
投票

如果您想在使用 kotlin 协程时等待任务完成。简单看一下Async/Await的概念。通常可在 YouTube 上找到。

使用 Async/Await 时,您的协程将等待完成,然后执行进一步编写的代码。

这将解决您的问题。

import androidx.lifecycle.ViewModel
import androidx.lifecycle.viewModelScope
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.async
import kotlinx.coroutines.withContext

class MyViewModel : ViewModel() {

    suspend fun performAsyncOperation(): String {
        return withContext(Dispatchers.IO) {
            val deferredResult = async {
                // Simulate an asynchronous operation, e.g., network request
                simulateNetworkRequest()
            }
            deferredResult.await()
        }
    }

    private suspend fun simulateNetworkRequest(): String {
        // Simulate a network request
        kotlinx.coroutines.delay(2000) // Delay for 2 seconds
        return "Data from the network"
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.