Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/kotlin/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 为什么suspend不适用于LiveData?_Android_Kotlin_Coroutine - Fatal编程技术网

Android 为什么suspend不适用于LiveData?

Android 为什么suspend不适用于LiveData?,android,kotlin,coroutine,Android,Kotlin,Coroutine,我正试图重写我的Kotlin数据库接口,以便将其与协同程序一起使用,因此我将所有函数挂起。但是当我运行应用程序时,我得到了一个错误:不知道如何将游标转换为这个方法的返回类型 失败代码: @Dao interface PostDao { @Query("SELECT * FROM post") suspend fun getAll(): LiveData<List<Post>> } 构建失败的函数返回LiveData对象,这似乎是问题所

我正试图重写我的Kotlin数据库接口,以便将其与协同程序一起使用,因此我将所有函数挂起。但是当我运行应用程序时,我得到了一个错误:不知道如何将游标转换为这个方法的返回类型

失败代码:

@Dao
interface PostDao {
    @Query("SELECT * FROM post")
    suspend fun getAll(): LiveData<List<Post>>
}
构建失败的函数返回LiveData对象,这似乎是问题所在,因为如果我删除suspend单词或LiveData,应用程序就会正常工作

工作变量:

@Dao
interface PostDao {
    @Query("SELECT * FROM post")
    fun getAll(): LiveData<List<Post>>
}

有人能解释一下为什么会这样吗?有没有办法使用suspend函数返回LiveData?

使用suspend函数返回LiveData实际上没有意义。生成LiveData实例是一个非阻塞操作,因此没有理由挂起它。在LiveData的情况下,阻塞数据请求在后台发生,并在已经返回的LiveData准备就绪时更新它,而不是等待数据然后生成LiveData

若对数据使用挂起函数,只需返回列表即可。调用这个suspend函数将使请求只发生一次,挂起直到数据准备就绪,然后在协同程序中返回它

如果您希望不断地接收更新的数据,那么您需要的是一个协程流。由于流是冷的,因此不使用挂起功能:

@Dao
interface PostDao {
    @Query("SELECT * FROM post")
    fun getAll(): Flow<List<Post>>
}
或者,您可以将其转换为热状态流或SharedFlow,其中的共识似乎是,它应该优先于LiveData,因为它不直接与Android细节相关联:

val postsSharedFlow = repository.getAll().shareIn(viewModelScope, SharingStarted.Eagerly, 1)
您可以阅读有关订阅SharedFlow和StateFlow的信息

val postsSharedFlow = repository.getAll().shareIn(viewModelScope, SharingStarted.Eagerly, 1)