让我从示例代码片段开始

suspend fun executeLive(result: MutableLiveData<Person>) {

    val response = ... //suspend api request

    mediatorLiveData.removeSource(response)

    mediatorLiveData.addSource(response) {
        result.value = sortData(it) // sortData is also suspend function which sortData at Dispatcher.Default
    }

}

在这个例子中,sortData不能在lambda function下调用(在这种情况下为addSource),而且我已经将executeLive声明为suspend,这就是为什么suspend api请求可以首先开始的原因。但是sortData函数显示编译时错误



那么,如何更改代码结构来解决此问题?

更新:是否有与此相关的文章?

最佳答案

Lambda通常是一个回调函数。之所以称为回调函数,是因为我们将代码块包装在一个函数中,然后将其传递给其他人(或其他地方)执行。这是控制的基本反转,代码不是由您执行,而是由其他人执行(例如框架)。

例如,当您在按钮上设置onClickListener时,我们不知道何时调用它,我们为框架传递了一个lambda,该框架负责用户交互以调用指定的 Action 。

在您的情况下,类似地,suspend函数没有调用sortdata,而是将其传递给mediatorLiveData对象以在其自己的上下文中对其进行调用。不必从协程体内调用您传递的lambda,因为这样是不允许的。

08-18 19:02
查看更多