让我从示例代码片段开始
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,因为这样是不允许的。